qt怎么显示乱码?qt显示乱码原因及解决步骤

阳光 2022-10-09 19:16:00 java常见问答 5604

企业开发项目的时候,使用qt的次数还是很多的,不过qt虽然好用,可是在使用的过程中也会出现乱码的情况,一旦有乱码出现就会影响开发人员的开发进度,那qt怎么显示乱码?接下来我们就来给大家讲解一下这方面的内容。

qt怎么显示乱码.png

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工具网。

推荐阅读:

学java哪本书比较好?Java有用书籍推荐

redis性能怎么优化?redis+骚操作项目之redis性能优化

java写游戏脚本怎么样?java如何开发桌球小游戏?