在Visual C++中使用UTF-8格式代码文件

Visual C++(Visual Studio中的C++编译器)工程中的代码文件默认使用ANSI编码,这样容易导致以下问题:

  1. 在其他语言的环境中编辑、生成工程时可能会出现乱码,因为ANSI的具体编码取决于系统设置;
  2. 在引用第三方库(通常是UTF-8格式)的头文件时,不能正确解析文件中的非ASCII字符。

要在Visual C++的工程中使用UTF-8编码,需要实现两个目标:

  1. 让Visual Studio以UTF-8编码保存代码文件;
  2. 让编译器以UTF-8编码编译代码文件。

以UTF-8保存代码文件

包括Visual Studio在内的很多IDE和编辑器支持EditorConfig功能,通过.editorconfig配置文件可以指定编辑器的格式、编码等行为。在包含源代码的文件夹中新建一个名为.editorconfig的文本文件,在文件中输入:

[*.{cpp,h}]
charset = utf-8

这样,Visual Studio在保存这个文件夹内的.cpp.h文件时就会自动使用UTF-8编码。

以UTF-8编译代码文件

Visual C++的编译器(cl.exe)在启用/utf-8选项后会以UTF-8编码格式解析代码文件(参见/utf-8 (Set Source and Executable character sets to UTF-8) | Microsoft Docs)。如图所示,在Visual Studio的项目属性中,进入“配置属性-C/C++-命令行”页面,在“其他选项”中增加一个/utf-8选项,即可在编译时使用UTF-8编码。

注意:使用/utf-8选项后,源代码字符集和执行字符集均被设置为UTF-8,即编译出的二进制文件中的窄字符串字面量均以UTF-8编码存储,但是Windows API处理窄字符串默认情况下按照ANSI编码处理,这会导致乱码现象出现。在较新版本Windows中,可以在manifest中将该程序的ANSI编码指定为UTF-8。

如果只希望修改源代码的编码格式,但不希望改变程序的行为,可以将/utf-8改为/source-charset:utf-8。这样,编译出的二进制文件仍然使用默认的ANSI执行字符集,可以如往常一样正常使用窄字符串API。

注意:使用ANSI执行字符集的程序中,窄字符串字面量以ANSI编码存储,在当用户更改地区设置时会可能会发生乱码现象,该现象与源代码是否使用UTF-8编码无关。

将现有代码文件重新保存为UTF-8编码

进行了以上两个步骤之后,现有的代码的编码不会自动改变。若原先的代码文件中有中文,则在生成时会出现如下错误:

warning C4828: 文件包含在偏移 0x9e5 处开始的字符,该字符在当前源字符集中无效(代码页 65001)。

这时,只需要在Visual Studio中打开出现警告的文件,点击“保存”按钮,Visual Studio就会自动按照EditorConfig中设置的编码格式重新保存了。

若没有出现该警告,则说明代码文件中不包含非ASCII字符,无需另作处理。

总结

至此,Visual C++工程就改为使用UTF-8编码了。