【问题标题】:warning c4819 in Visual Studio C++ 2013 express - utf8 files without bomVisual Studio C++ 2013 express 中的警告 c4819 - 没有 bom 的 utf8 文件
【发布时间】:2015-02-17 03:28:14
【问题描述】:

在 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 标记,尤其是如果源代码保存在代码存储库中。

【问题讨论】:

  • @sjdowling 这不是很有帮助。另外,欢迎您来晚了好几年。
  • @HansPassant:我不是日本人(虽然会说和读一点),但我在我的机器上使用该语言环境。
  • @HansPassant:我的机器设置了日语语言环境。英文文本,shift-jis 作为默认代码页。文本编辑器 - 在 Visual Studio 中 - 正确打开每个文件并将编码标识为 utf8。但是,在我开始编译文件的那一刻,我会收到很多这样的警告,因为编译器与文本编辑器不同,无法识别没有 bom 的 utf8。文件的来源无关紧要,因为任何带有非 ascii 符号的文件都会触发该警告。如果我不走运,我会得到编译错误(utf8 被误认为 shift-jis can eat " 符号,意思是“不断换行”和许多其他有趣的东西)。
  • 现在我已经成功地把自己弄糊涂了。该消息表明编译器正在尝试将字符串填充到 shift-jis 中。但是,根据我的经验,它实际上所做的是试图解释文件在 shift-jis 中,尽管它在 utf8 中,因为即使有问题的 char 在注释块内,您也会收到此警告。 :-\需要考虑一下。
  • @HansPassant:这是编译器级别 1 警告 c4819,如 msdn 中所述。不是文本编辑器警告。

标签: c++ visual-studio utf-8 visual-studio-2013


【解决方案1】:

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

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

【讨论】:

  • 无需猜测编译器是否有像 gcc 这样的命令行开关。 #pragma 不起作用,只有资源编译器才能理解它。添加 BOM 对您自己的代码有效,但对于您想要使用的最初为不同编译器开发的库来说非常烦人。
  • 因为项目不是我的(意味着我添加bom的那一刻我创建了一个fork),跨平台项目使用不带bom的utf8是相当标准的做法,可能有数百个这样的文件.此外,文本编辑器可以正确识别编码,尽管没有 BOM。编译器可以做同样的事情。无论如何,在这一点上,我更喜欢全局切换。
【解决方案2】:

到目前为止,我还没有遇到任何问题的解决方案。

如果存在针对此行为的修复程序,显然它是保密的。

【讨论】:

    【解决方案3】:

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

    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.
    

    More details in the image

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

    【讨论】:

      【解决方案4】:

      更新到 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多