欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-01 14:26:08
...

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

相关标签: qt