xouou 发表于 2019-12-14 11:03

QT5.13+VC2015彻底解决编译错误和中文乱码问题

本帖最后由 xouou 于 2019-12-14 11:20 编辑

最近使用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




截图表示下,都是手打,不是转载(同我的博客)

mmomm 发表于 2019-12-14 12:02

学习了,大神牛逼!

作死小王子 发表于 2019-12-14 12:10

大佬博客在哪我初学编程想学习

dmxayjn 发表于 2019-12-14 13:32

好想学 c++
不知道 怎么学,怎么入门。
页: [1]
查看完整版本: QT5.13+VC2015彻底解决编译错误和中文乱码问题