最近常有人问关于编译字符集的问题,故此记录一下。
这类问题一般表现为编译的时候,有语法错误或符号解析失败,错误提示五花八门,比如
- error C2143:语法错误:缺少";"(在“类型”的前面)
- error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
这类问题不一定是编译字符集错误,更有可能是宏引起的,也有换行符问题。
不过,在排查问题的时候,这也是一种可能,常见于Qt
项目,从MinGW
迁移到MSVC
的时候发生。
这种问题的主要原因是:编译器字符集与源文件字符集对不上。
MSVC默认是使用本地字符集的,与系统相关,在国内主要是GBK。
MinGW默认是用的UTF-8,QtCreator的默认编辑字符集也是UTF-8,所以在MinGW编译器下可以编译的项目,在迁移到MSVC时往往会报错。
解决办法是在项目pro文件里,加上编译器选项 /utf-8
。 /wd"4819"
用来是禁止代码页警告的。
win32-msvc*:QMAKE_CXXFLAGS += /wd"4819" /utf-8
这里是微软的解释 https://docs.microsoft.com/zh-cn/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-170
该文档也可以解释为什么有时候编译没问题,运行时却一堆乱码——因为运行字符集与编译字符集对应不上。国内系统默认运行时使用 GBK,编译时使用的却是 UTF-8。
一些文章说要加上 /source-charset:utf-8
和 /execution-charset:utf-8
,如果没有都指定,就可能会出这种问题。根据微软文档,只要改成 /utf-8
就可以避免。