本文主要分析了基于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。这样源字符集,执行字符集都是一致。

Qt中文乱码原因及解决方案相关推荐

  1. qt中文乱码原因分析及解决方案

    首先说明几个基础概念 UTF-8 BOM 和 UTF-8.BOM在文件头位置占三个字节,用来标识UTF-8编码,软件通过BOM来识别这个文件是否是UTF-8编码. 源码字符集.源码文件使用某种编码格式 ...

  2. 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

    尊重作者,支持原创,如需转载,请附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205 一.Qt Creator环境设置 1 ...

  3. qt android 中文乱码,Qt与MSVC中文乱码问题的解决方案

    Qt与MSVC中文乱码问题的解决方案 一.问题是什么? 在学习Qt编程的过程中,大多数人都遇到过中文乱码的问题.总结起来有三类: 1.Qt Creator中显示的汉字变为乱码,编辑器上方有" ...

  4. Qt向Oracle插入中文乱码问题的解决方案

    Qt向Oracle插入中文乱码问题的解决方案 常见问题 Q: 当服务器字符集为US7ASCII时,会发现无论是读取中文还是写入中文都是? A: 这是由于Qt默认的字符编码是utf8,而US7ASCII ...

  5. Qt中文乱码解决思路

    最近项目中遇到不少的Qt中文乱码的问题,主要原因是客户的需求比较多,Qt版本有用4的版本的也有用5的版本,并且还有windows与linux跨平台的需求. 经常出现个问题是windows的解决了,源代 ...

  6. JSP中文乱码问题终极解决方案(转)

    JSP中文乱码问题终极解决方案 http://www.cnblogs.com/beijiguangyong/archive/2012/03/31/2437124.html 在介绍方法之前我们首先应该清 ...

  7. Java中文乱码破碎重组_Java 关于中文乱码问题的解决方案与经验

    五.我们要对java的编译器有所了解: Javac ?encoding 我们常常没有用到encoding这个参数.其实encoding这个参数对于跨平台的操作是很重要的.如果没有指定encoding, ...

  8. QT中文乱码解决思路和方法汇总

    QT中文乱码解决思路和方法 中文编码一律使用QString::fromLocal8Bit()接口,原因是为了支持QT4版本.QStringLiteral()方法也可以使用,它是支持QT5版本的: CP ...

  9. QT中文乱码解决方法2

    转载自:http://blog.163.com/seven_7_one/blog/static/162606412201032955449489/ QT中文乱码的解 2010-04-29 17:54: ...

最新文章

  1. 理解并取证:DHCP的工作原理、怎么检测IP地址冲突
  2. 字节跳动开源分布式训练框架BytePS,登上GitHub热榜
  3. java程序设计第一次作业
  4. (转)完全使用gnu/linux工作
  5. 研招网【2022考研党需提前做好的8点准备】
  6. 深度探索C++对象模型——关于对象
  7. jq循环取数据 ,一直记不住,放到这
  8. iOS开发ARC内存管理
  9. Hyperledger Fabric学习笔记(四)- fabric单机部署 solo 版
  10. 工作流牛人 Jan Mendling
  11. 浅谈一下静态代理IP都能用来干什么?
  12. C# Form窗体显示不完整
  13. 测试工具大全http://blog.csdn.net/vincetest/archive/2006/12/12/1440353.aspx
  14. 程序员的真实工资是多少?
  15. Aardio 第一天:使用虚表和适配器+试融合Java
  16. 宇视摄像机实况画面不清晰排查方法
  17. kol营销推广 | 达人营销,如何精准且快速找达人?
  18. 异常处理基于注解ExceptionHandler
  19. “花式提涨薪,结果被套路”,不懂怎么跟老板提加薪?这个方法真的很好用
  20. RGB、YUV和HSV颜色空间模型

热门文章

  1. 单机大天使服务器端修改商店,《大天使之剑h5》变态单机版最新开服_无限钻石打造最强阵容_满V公益私服...
  2. validation 分组校验注解大全及使用详解
  3. xshell免费版安装
  4. SpringMVC之CRUD和文件上传下载
  5. weboffice控件接收html文件,WebOffice 文档控件API
  6. Android Window悬浮窗窗口全屏(隐藏导航栏状态栏)
  7. css文字和数字或者英文对不齐解决方案
  8. matlab支持 编程语言,用于数学的10个优秀编程语言
  9. 完美解决Win10重命名文件导致资源管理器卡死
  10. android手机主板,主板芯片全解