编译字符集问题

最近常有人问关于编译字符集的问题,故此记录一下。
这类问题一般表现为编译的时候,有语法错误或符号解析失败,错误提示五花八门,比如

  • 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 就可以避免。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值