问题

解释1

至于为什么vs在UTF-8编码下,对一段中文的编译有错误?我查了一下vs的编译器对Unicode源代码支持,如下:

  1. UTF-16 little endian with or without byte order mark (BOM)

  2. UTF-16 big endian with or without BOM

  3. UTF-8 with BOM

注意下,没有UTF-8哦,源码是UTF-8情况下一般VS会给如下warning:

warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。
VS在UTF-8文件编译时,如果出现以中文结尾的一行注释,那么这个换行符很可能会被丢掉,导致下一行代码被注释。但并不是所有的中文注释都出错,也许和字符的编码值有关。

因此就会出现“改了行注释代码就执行错了”的诡异bug或者“改了下注释代码就执行对了”的诡异“解决方案”。

解释2

MSVC在编译时,会根据源代码文件有无BOM来定义源码字符集。如果有BOM,则按BOM解释识别编码;如果没有,则使用本地字符集,对于简体中文的Windows操作系统就是GB2312。那么,当MSVC遇到一个没有BOM的UTF-8编码的文件时,它通常会把文件看作GB2312的来处理。如果文件全是英文没有问题,但如果包含中文MSVC编译器就不能正常识别字符,编译就会报错。

解决办法:

1.把文件编码改为UTF-8 带BOM
2.在要加中文的cpp或h文件加入该预处理

#pragma execution_character_set(“utf-8”)

3.工程编译中增加 /utf-8 编译选项,这样可以避免UTF-8中文的问题。
图

说这么多,需要大家关注的就是,中文注释编译不过时,改成英文注释。或者改成UTF-8 with BOM,不要被BOM的编译问题困扰太久。

参考链接

1.https://zhuanlan.zhihu.com/p/371796531
2.https://docs.microsoft.com/en-us/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-140