原文
你可通过/source-charset
编译器开关告诉VS
编译器,在读取源文件
时使用什么编码
.如果未指定编码
,则编译器会试猜测:
1,如果文件以UTF-16BOM
开头,则按UTF-16
解释源文件
.
2,如果文件以UTF-8BOM
开头,则按UTF-8
解释源文件
.
3,否则,默认在用户代码页
中解释源文件
.
这些设置
由可能导致与实际期望的文件编码
不同步的你的项目配置
决定.
对C和C++
,至少可断定编译器配置和文件编码
与你的期望
匹配.这样,如果VS
秘密地把文件按UTF-8
更改CP1252
编码,如,1
,你可强制编译器
错误,来提醒你文件编码弄乱了
.
//如果要确保它是`CP1252`
static_assert(''' == '\x92', "文件编码有问题");
//如果要确保它是`UTF-8`.
static_assert(L'' == L'\x2603', "文件编码有问题");
对代码页1252
,我选择了符'
,这是代码页1252
中的0x92
代码单元,在资源文件
中经常破坏.
如果按UTF-8
保存文件,则按'0xE20x800x99
三个字节编码,如果文件
没有UTF-8BOM
(并且你不用/source-charset
选项),编译器会按美标
符解释这些符
,在单引号
间看到三个符
,并产生"常数中太多符"
错误.
对统一
,我使用雪人
符,因为它不在常见的8位代码页
中,因此如果意外按美标
转换文件,雪人
可能会变成问号
并抛静断失败
.
VS
,似乎真的很喜欢
在不告诉你
时,偷偷地按UTF-8
转换文件.如前,源码控制系统
一般不会告诉你更改了编码
,即很容易在审查代码中看不出来
,从而意外地破坏文件
.