qt中文乱码怎么解决?qt中文乱码原因以及解决方法

Qt中文乱码一直是开发人员头疼的问题,一旦遇到这样的情况就需要及时去解决,否则就会影响开发效率,那qt中文乱码怎么解决?接下来我们就来给大家讲解一下qt中文乱码原因以及解决方法。

qt中文乱码怎么解决.jpg

Qt5中QString内部采用unicode字符集,utf-16编码。构造函数QString::QString(const char *str) 默认使用 fromUtf8() 将str所指的执行字符集从 utf-8 转码成 utf-16。

由上面fromUtf8()可知,QString需要执行字符集编码为utf-8,然后以utf-8进行解码,再编码为utf-16才能获得正确的字符编码。

显示中文乱码的原因其实就QString转码方式与执行字符集不一致。(比如,源字符集为本地字符集GBK编码,QString以utf-8的方式进行解码,会导致获得错误的二进制编码,再将错误二进制转为utf-16就会出现乱码。)

中文乱码测试

使用如下方法进行测试:首先创建QString对象str并初始化,因为QString构造函数内部调用了QString::fromUtf8(),所以它俩表现应该一致。QString::fromLocal8Bit()将执行字符集以本地编码转为utf-16。具体代码如下:

qt中文乱码怎么解决?qt中文乱码原因以及解决方法.png

例1,创建一个编码为带BOM标识的utf-8源文件,打印如下:

1.png

打印前两个发生了乱码,fromLocal8Bit显示正常。源文件带BOM标识,因此编译器可以正确识别源文件字符编码,并以正确地方式将源字符集(utf-8编码)转为执行字符集即local字符集(GBK编码)。此时执行字符集为loacl字符集,而fromUtf8将执行字符集以utf-8方式进行解码,所以会出现乱码。fromLocal8Bit将执行字符集以本地编码进行转码,因此获得正确的字符编码。

例2,创建一个编码为不带BOM标识的utf-8源文件,打印如下:

2.png

打印前两个显示正常,fromLocal8Bit发生了乱码。源文件不带BOM标识,因此编译器会认为源文件编码为本地编码,而执行字符集也是本地编码,因此不会进行转码(本人推测的0.0),但实际上执行字符集是utf-8编码。因此fromUtf8将执行字符集以utf-8进行解码,显示正确;而fromLocal8Bit将执行字符集以本地编码进行解码,显示乱码。

例3,使用预处理命令#pragma execution_character_set(“utf-8”),将执行字符集设置为utf-8。创建一个编码为带BOM标识的utf-8源文件.,打印如下:

3.png

打印前两个显示正常,fromLocal8Bit发生了乱码。编译器识别源文件字符编码为utf-8,执行字符集也为utf-8,因此不会转码。fromUtf8可以正确的以utf-8进行解码,显示正确。而fromLocal8Bit将执行字符集以本地编码进行解码,显示乱码。

例4,使用预处理命令#pragma execution_character_set(“utf-8”),将执行字符集设置为utf-8。创建一个编码为不带BOM标识的utf8源文件.,打印如下:

4.png

三个显示乱码。编译器识别源文件字符编码为本地编码(实际为utf-8编码),并错误地将源字符集以本地编码进行解码,再编码为utf-8(相当于utf-8以本地编码转码为utf-8)。因此三者都显示乱码。

中文乱码解决方法

综上所述,解决Qt5中文乱码的一个比较好的方式,源文件设置BOM标识的utf-8编码,执行字符集为设置为utf-8。这样源字符集,执行字符集都是一致。

其实只要我们知道了Qt中文乱码的原因就好解决了,所以遇到qt乱码大家也不要慌张,只要按照文中的操作就可以了!最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

spring面试题有哪些?spring面试题汇集与答案

java写游戏需要的工具有哪些?Java能开发大型游戏吗?

Java如何写游戏脚本?java写游戏脚本教程之java实现纸牌游戏