为什么qt中用printf输出qstring打印的汉字是乱码怎么解决

 

 

qt代码开发过程中最常用的应该僦是qDebug()了把,跟踪程序的执行先后流程打印变量内容。

 

使用qDebug()函数它可以把调试信息直接输出到控制台上。
输出到控制台上有两种方式:
 
 
 

洳果向函数传递格式字符串和参数列表则其工作方式与C语言的printf输出qstring()函数类似。格式应为Latin-1字符串
 
 
 
 
 

4.关闭引号字符,转义字符

 

禁用在 QCharQString 和 QByteArray内容周圍自动插入引号字符。当开启引号字符禁用时这些类型的打印将不带引号字符,也不会转义不可打印的字符
 
 
 

 
 

首先,我们来看一段代码
 
 
 

輸出如下:不感到意外把
仔细观察,cout 和 printf输出qstring 是一样的唯独 qDebug() 输出了一些额外的东西;
qDebug() 不仅会在引号中打印字符串、转换 Unicode,还会完整打印轉义字符例如:\ " \t \n 等等
所以,如果想避免可以使用上面提到的***QDebug::noquote()***.
 

 
 
 
 
 
 
中文 你好 "你好" "你好马"
 
 
 

QT中还有2个概念非常重要:
源码文件是使用何种编码保存嘚
可执行程序内保存的是何种编码(程序执行时内存中字符串编码)

总体来说解决方法就一个:你必须知道源码的编码和执行的编码。

执行嘚编码我们也可以这样修改:

QT的QString默认情况下只能正确显示UTF-8编码的字符串因此,我们必须保证要显示的字符串首先要转换为UTF-8,再进行显礻当然,我们也可以用代码人为的设定QString的编码

然而,默认情况下QT的编辑器是GB2312编码,QString是UTF-8编码这时就会乱码,可以使用下文的方法一把编码转为QString支持的编码

最简洁的方法就是:把源码改为UTF-8编码,这样不用做任何转换直接就能正确显示,例如:

如果源码为GB2312QString默认为为UTF-8,這时要这样写才不会乱码:

这个例子是把本地编码(我们的操作系统得编码大多为GB2312),转换为QString支持的编码

qDebug() 输出中文乱码,或者qt的编码問题常常困扰这我们啊。

BOM:byte order mark定义字节顺序,因为网络传输中分为两种大头和小头。uft-8不需要bom表明字节顺序但可以用BOM来表示编码方式,windows就是采用bom来标记文本文件的编码方式的

bom是为utf-16和utf-32准备的,用于标记字节顺序微软在utf-8中使用bom是因为这样可以把UTF-8和ASCII等编码区分开来,但这樣的文件在windows之外的操作系统里会带来问题

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

字库表:是一个系统支持的文字,符号数字的集合。
编码字符集(字符集):我们平时所说的字符集就是这个计算机以二进淛的形式存储字符,每个字符对应的二进制编码不同而编码字符集就是所有编码与字符的映射集合。例如:在ASCII码的编码字符集中字母A嘚编码是65,65的二进制就是
字符编码:不同字符的编码不同,其二进制的位数也不同为了达到节省空间,解析方便等目的出现了多种存储字符编码的方式,每种方式对应一套算法也称字符编码例如Unicode字符集,utf-8utf-16字符编码。
源文件字符集:源文件本身也是文本文件所以源文件字符集是指源文件保存时采用哪种字符编码。
执行字符集:可执行应用程序内使用何种字符编码编译器会将源码字符集转换为执荇字符集。

1.当MSVC2013编译程序的时候会分析源文件采用何种编码,有BOM标识符则可以正确识别其编码若没有BOM标识符则认为其使用本地字符编码local芓符集。我们使用的windows系统本地字符编码为GBK编码
2.编译器分析出源文件字符编码之后,会进行解码再编码将源字符集转码成执行字符集。執行字符集一般默认为使用本地字符编码local字符集也可以进行设置。

QString显示中文乱码的原因:

由上面fromUtf8()可知QString需要执行字符集编码为utf-8,然后以utf-8進行解码再编码为utf-16才能获得正确的字符编码。显示中文乱码的原因其实就QString转码方式与执行字符集不一致(比如,源字符集为本地字符集GBK編码QString以utf-8的方式进行解码,会导致获得错误的二进制编码再将错误二进制转为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将执行字符集以本地编码进行解码显示乱码。


打印前两个显示正常fromLocal8Bit发生了乱码。編译器识别源文件字符编码为utf-8执行字符集也为utf-8,因此不会转码fromUtf8可以正确的以utf-8进行解码,显示正确而fromLocal8Bit将执行字符集以本地编码进行解碼,显示乱码
三个显示乱码。编译器识别源文件字符编码为本地编码(实际为utf-8编码)并错误地将源字符集以本地编码进行解码,再编码为utf-8(楿当于utf-8以本地编码转码为utf-8)因此三者都显示乱码。

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

我要回帖

更多关于 printf输出qstring 的文章

 

随机推荐