Компилятор VS2019 неверно интерпретирует UTF8 без файла спецификации как ANSI - PullRequest
1 голос
/ 30 сентября 2019

Я использовал для компиляции моего приложения C ++ wxWidgets-3.1.1 (Win10x64) с VS2015 Express. Я хотел обновить свою среду IDE до сообщества VS2019, которое, казалось, работало довольно хорошо. Файлы моего проекта частично взяты из более старых проектов, поэтому их кодировка отличается (Windows-1252, UTF-8 без BOM, ANSI).

С VS2015 я смог компилировать и выдавать сообщения (жестко закодированные в моем .cppфайлы), который правильно отображал символы Юникода. То же приложение, скомпилированное с сообществом VS2019, показывает, например, немецкое слово "übergabe" как "¼bergabe", которое не интерпретируется как UTF8.

Сохранение файла .cpp, который содержит Unicode, в явном виде, поскольку UTF8 WITH BOM решает эту проблему,Но я не хочу запускать все файлы во всех проектах. Могу ли я изменить ожидаемый ввод из файла "без спецификации" на UTF-8, чтобы получить то же поведение, что и у VS2015?

[EDIT] Кажется, такой опции нет. Как я уже говорил, преобразование всех файлов .cpp / .h в UTF-8-BOM является решением. Таким образом, пока единственным подходящим способом является циклический просмотр каталога, перезапись файлов в UTF-8 с добавлением спецификации.

Используя C ++ wxWidgets, это (часть) моя попытка автоматизировать процесс:

//Read in the file, convert its content to UTF8 if necessary
wxFileInputStream fis(fileFullPath);
wxFile file(fileFullPath);
size_t dataSize = file.Length();
void* data = malloc(dataSize);
if (!fis.ReadAll(data, dataSize))
{
    wxString sErr;
    sErr << "Couldn't read file: " << fileFullPath;
    wxLogError(sErr);
}
else
{
    wxString sData((char*)data, dataSize);
    wxString sUTF8Data;
    if (wxEmptyString == wxString::FromUTF8(sData))
    {
        sUTF8Data = sData.ToUTF8();
    }
    else
    {
        sUTF8Data = sData;
    }
    wxFFileOutputStream out(fileFullPath);

    wxBOM bomType = wxConvAuto::DetectBOM(sUTF8Data, sUTF8Data.size());
    if (wxBOM_UTF8 != bomType)
    {
        if (wxBOM_None == bomType)
        {
            unsigned char utf8bom[] = { 0xEF,0xBB,0xBF };
            out.Write((char*)utf8bom, sizeof(utf8bom));
        }
        else
        {
            wxLogError("File already contains a different BOM: " + fileFullPath);
        }
    }
}

Обратите внимание, что это не может конвертировать все кодировки, в основном это может конвертировать только файлы ANSI или добавить спецификацию в файлы UTF-8 без спецификации. Для всех остальных кодировок я открываю проект в VS2019, выбираю файл и захожу (свободно переводятся на английский, имена могут отличаться): -> Файл -> XXX.cpp сохранить как ... -> Использовать маленькую стрелку в "Кнопка "Сохранить" -> Сохранить с кодировкой ... -> Заменить? Да! -> «Unicode (UTF-8 с подписью) - кодовая страница 65001» (не берите «UTF-8 без подписи», хотя это тоже кодовая страница 65001!)

...