Я использовал для компиляции моего приложения 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!)