QT5.13+VC2015彻底解决编译错误和中文乱码问题
最近使用QT5.13+VC2015遇到编译错误,和中文乱码问题
网上搜了很多方法, 没发现彻底解决的,
有的人说转换文本编码 , 跨平台再转回去? 这要怎么发布?
还有的说一个个添加#pragma指令, 文件一多改来改去咋办,这不现实
遂做了很多实验最终解决,分享给小伙伴们.
这个问题只是在用vc编译时才有, 用minGW是没有, 为何要用vc?
因为vc支持WebEngine
linux下是没有utf-8的bom头的, 因为utf8没有字节序问题,也就不需要bom头,并且这样可以兼容ASCii码 ,
而vc默认是使用当前系统的编码(local code == GBK), 它和UTF8就冲突了,
因此, 要多一个所谓的BOM头来识别UTF8,不然vc还以为它是gbk呢
实验过程:
1.如果编码是utf-8无bom, 在pro中的添加的是
msvc:QMAKE_CXXFLAGS += -source-charset:utf-8
则编译通过, 运行时界面乱码
此时若中文字符串用u8修饰,
QObject::tr(u8"label:我是个窗口")
则编译通,运行没有乱码!
2.如果编码是utf-8无bom,在pro中的添加的是
msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8
则没有效果, 编译错误, C2001; C2146 ; C2143
此时若中文字符串用u8修饰,
QObject::tr(u8"label:我是个窗口")
依然编译错误!
3.如果编码是utf-8无bom,在pro中的添加的是
msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8
msvc:QMAKE_CXXFLAGS += -source-charset:utf-8
则编译通过,且运行时中文正常
4.如果编码是utf-8无bom, pro无添加,用u8修饰没效果,编译错误
5.如果编码是utf-8+bom, 在pro中无添加
则编译能通过,但运行时中文乱码
6.如果编码是utf-8+bom, 在pro中无添加,
但中文字符用u8前缀修饰,QObject::tr(u8"label:我是个窗口")
则编译能通过,运行中文没有乱码.ok
u8虽然起到了效果, 但只能局部使用, 文件太多的话就很难一个个修改了.
7.如果编码是utf-8+bom, 在pro中添加,
msvc:QMAKE_CXXFLAGS += -source-charset:utf-8
则编译能通过,但运行时中文乱码
这个就等于是第5条, 既然有bom那么vc能识别出这个源文件是utf8,
所以在pro再重复指定一次是多余的,并没有指定执行字符集.
7.如果编码是utf-8+bom, 在pro中添加,
msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8
则编译能通过, 执行也无乱码
综上所述:
在用vc编译器时对于没有bom头的utf-8文本编译出错,只要源文件中对字符串加utf8修饰是没用的(修饰符就是u8""形式),
网上有说在源文件加#pragma execution_character_set("utf-8")有用吗?
明显是没用的,编译都通不过,还怎么执行.
msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8 这条是让程序执行时使用utf-8字符集
msvc:QMAKE_CXXFLAGS += -source-charset:utf-8 这条是告诉vc编译器识别源文件编码类型是utf-8
u8修饰符是让程序执行时使用utf-8字符集(显然这种方法只适合少量文本修改,不通用,兼容性差)
总结:
推荐在pro中添加以下3条指令,不管带不带bom都能解决常见的编码问题
即彻底解决C4819警告,C2001错误而不需要转换编码,不需要修改源码!!!
msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8
msvc:QMAKE_CXXFLAGS += -source-charset:utf-8
QMAKE_CXXFLAGS_WARN_ON += -wd4819