gpt4 book ai didi

c++ - VS2019编译器将没有BOM文件的UTF8误解为ANSI

转载 作者:行者123 更新时间:2023-12-02 10:23:31 29 4
gpt4 key购买 nike

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

使用VS2015,我可以编译并发出消息(在.cpp文件中进行了硬编码),该消息可以正确显示unicode字符。
使用VS2019社区编译的同一应用程序例如显示德语单词“übergabe”为“¼bergabe”,这是未经解释的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);
}
}
}

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

最佳答案

/ utf-8选项将源字符集和执行字符集都指定为UTF-8。
Check the Microsoft docs
The C++ team blog that explains the charset problem

关于c++ - VS2019编译器将没有BOM文件的UTF8误解为ANSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58163785/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com