VS2019编译器将没有BOM文件的UTF8错误解释为ANSI

VS2019 compiler misinterprets UTF8 without BOM file as ANSI

本文关键字:错误 UTF8 解释 ANSI 文件 编译器 BOM VS2019      更新时间:2023-10-16

我曾经用VS2015 Express编译我的C++wxWidgets-3.1.1应用程序(Win10x64(。我想将我的IDE升级到VS2019社区,它似乎运行良好。 我的项目文件部分来自旧项目,因此它们的编码不同(Windows-1252,不带BOM的UTF-8,ANSI(。

使用VS2015,我能够编译并发出消息(在我的.cpp文件中硬编码(,这些消息可以正确显示Unicode字符。 使用VS2019社区编译的同一应用程序显示,例如德语单词"übergabe"为"Ã1/4bergabe",这是未解释的UTF8。

将包含 unicode 的.cpp文件显式保存为 UTF8 WITH BOM 可以解决此问题。但我不想遍历所有项目中的所有文件。我是否可以将预期输入从"无BOM"文件更改为UTF-8,以获得与VS2015相同的行为?

[编辑]似乎没有这样的选择。正如我之前所说,将所有 .cpp/.h 文件转换为 UTF-8-BOM 是一种解决方案。 因此,到目前为止,唯一合适的方法是遍历目录,在 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);
}
}
}

请注意,这不能转换所有编码,基本上 afaik 它只能转换 ANSI 文件或将 BOM 添加到没有 BOM 的 UTF-8 文件。对于所有其他编码,我在VS2019中打开项目,选择文件并继续(自由翻译成英文,名称可能不同(: ->文件 ->XXX.cpp另存为... -> 使用"保存"按钮中的小箭头 -> 使用编码保存... -> 替换?是的!-> "Unicode(带签名的 UTF-8(- 代码页 65001" (不过,不要使用"没有签名的 UTF-8",这也是代码页 65001!

选项/utf-8 将源字符集和执行字符集指定为 UTF-8。

查看Microsoft文档

解释字符集问题的C++团队博客