Visual C++使用UTF-8编码

Visual 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编码

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

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

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

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

总结

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