警告 C4819 在 Visual Studio C++ 2013 Express - 没有 BOM 的 UTF8 文件



在Visual Studio C++ 2013 express中,似乎除非utf8编码的文件具有BOM标记,否则编译器无法理解正在编译的文件是UTF8编码,并将其视为本机编码。但是,代码编辑器没有此问题。

warning C4819: The file contains a character that cannot be represented in the current code page (932). Save the file in Unicode format to prevent data loss

是否有针对此行为的修复方法?我记得这是所有Visual Studio版本中的常见问题,但我不记得曾经看到过修复程序。我不能完全继续为每个不是我的文件添加 bom 标记,特别是如果源代码在代码存储库中维护。

> 更新到 Visual Studio 2015。 它支持源和执行字符集的新编译器选项。

可以使用 /utf-8 选项将源字符集和执行字符集指定为 UTF-8 编码的字符集。它等效于在命令行上指定/source-charset:utf-8 /execution-charset:utf-8。默认情况下,这些选项中的任何一个也会启用/validate-charset选项。

默认情况下,Visual Studio 会检测字节顺序标记,以确定源文件是否采用编码的 Unicode 格式,例如 UTF-16 或 UTF-8。如果未找到字节顺序标记,则假定源文件是使用当前用户代码页进行编码的,除非您已使用 /utf-8/source-charset 选项指定了代码页。Visual Studio允许您通过使用几个字符编码中的任何一个来保存C++源代码。

参考: https://msdn.microsoft.com/en-us/library/mt708821.aspx

编译器应该如何猜测你打算用哪种编码来解释文件?也就是说,有几种选择:

  • 为什么不简单地添加物料清单?这是标记 UTF-8 文件的一种很好的方法,因为它不太可能被误解。
  • 除此之外,我相信您可以使用#pragma告诉MSC有关编码的信息,尽管我自己从未使用过。
  • 最后,不使用基本字符集之外的任何内容也是一个选项,在我们的世界中略微过时,但仍然可靠。
到目前为止,

我还没有遇到任何问题的解决方案。

如果存在此行为的修复程序,显然它是受到良好保护的机密。

如果您的系统区域设置不是英语(例如中文或其他语言(,解决此问题的一种简单方法是将"区域和语言"的系统设置更改为英语。只需按照以下步骤操作:

Control Panel -> Clock,Language,and Region -> Region and Language -> 
Administrative -> Language for non-Unicode programs -> Change system locale.

这很简单吗?它解决了我的问题,因为我的系统区域设置是中文。"非Unicode程序的语言"的描述很清楚:

This setting (system locale) controls the language used when displaying 
text in programs that do not support Unicode.

图像中的更多详细信息

当我尝试在Windows上构建我的项目时,我遇到了这个问题,该项目在另一台Windows机器上成功。我疯狂地修改所有非Unicode字符(所有这些都是注释(,以便编译器可以继续前进。但是有太多文件有这个问题。

最新更新