ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Qt - 中文乱码原因以及解决方法

2022-02-16 20:33:04  阅读:140  来源: 互联网

标签:编码 中文 utf Qt 字符 源文件 字符集 乱码


转载自:https://blog.csdn.net/qq_35905572/article/details/95042444

本文主要分析了基于windows系统msvc2013编译器的Qt中文乱码。

 

概念

字库表:是一个系统支持的文字,符号,数字的集合。

编码字符集(字符集):我们平时所说的字符集就是这个,计算机以二进制的形式存储字符,每个字符对应的二进制编码不同,而编码字符集就是所有编码与字符的映射集合。

例如:在ASCII码的编码字符集中,字母A的编码是65,65的二进制就是01000001。

字符编码:不同字符的编码不同,其二进制的位数也不同。为了达到节省空间,解析方便等目的,出现了多种存储字符编码的方式,每种方式对应一套算法也称字符编码。

例如:Unicode字符集,utf-8,utf-16字符编码。

源文件字符集:源文件本身也是文本文件,所以源文件字符集是指源文件保存时采用哪种字符编码。

执行字符集:可执行应用程序内使用何种字符编码。编译器会将源码字符集转换为执行字符集。

注意

1、当MSVC2013编译程序的时候,会分析源文件采用何种编码,有BOM标识符则可以正确识别其编码,若没有BOM标识符则认为其使用本地字符编码local字符集。我们使用的windows系统本地字符编码为GBK编码。

2、编译器分析出源文件字符编码之后,会进行解码再编码,将源字符集转码成执行字符集。执行字符集一般默认为使用本地字符编码local字符集,也可以进行设置。

QString显示中文乱码的原因

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。具体代码如下:

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

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

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

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

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

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

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

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

中文乱码解决方法

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

 

标签:编码,中文,utf,Qt,字符,源文件,字符集,乱码
来源: https://www.cnblogs.com/citrus/p/15902208.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有