最近,公司项目的GUI界面使用的是Qt,研究了近两个月的Qt发现中文显示确实是一个问题,这个问题中主要存在两方面的问题:
【1】中文显示;
【2】中文乱码;
其中【1】问题出现的情景是:Qt的界面只有英文字母,中文一个都不显示,也不会出现乱码;【2】问题出现的情景是:Qt界面本来显示汉字的地方全部被乱码所代替。
【1】问题产生的原因是:Qt字库中没有相应的字体,提供给Qt的界面
【2】问题产生的原因是:中文编码转换的问题。
字节顺序标记(BOM)
出现在字节流的开头,在windows下保存UTF-8编码的文件时,会在开始的地方插入 BOM(0xEF,0xBB,0xBF),让编辑器识别文件是否为UTF-8编码。而标准的UFT-8是不带BOM的。也就是说,如果再Linux系统下,文件编码格式可以忽略BOM。。
注意:在Qtcreator(Linux平台下)中的“Tool”->"Options"下设置“UTF-8 BOM”时不要选择“Add If Encoding Is UTF-8“,如果选择这一项,在写代码的时候会添加BOM,而这样在编译的时候就会报错。
几种编码格式
UTF-8
Unicode TransformationFormat-8bit,允许含BOM,但标准的UTF-8不含BOM,用来统一国际上的字符,通用性强,属于国际编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。
GBK /GB2312
GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差。
Unicode
Unicode中存储了很多种编码的字符,它可以看做是很多种编码格式的集合。
乱码产生的原因
文件的编码格式有多种,因此同一的二进制文件可以被翻译成不同的符号。那么当一个文件用这种编码方式编辑但是却使用另一中编码方式打开的时候,就会出现乱码,而产生乱码的原因就是两种编码格式的字符的存储方式是不同的。
那么在Qt中出现乱码是怎么回事呢?
Linux平台下的Qtcreator的编码格式是UTF-8,中文使用三个字节来编码;而Qt中的QString使用Unicode来编码的。Unicode中有很多种编码格式的字符。那么当把一串中文赋值给QString定义的变量A时,就会存在一个问题,这串文字是以一种什么样的编码存储到Unicode中的?如果是以UTF-8的方式存储的,那么Qt上的字体就会显示正常;如果是以其他的编码方式存储的则会出现乱码。
在Qt程序中,如果不指明使用哪种编码存储到Unicode,那么会默认Latin-1编码,这样在Qt显示中文的时候就会出现乱码!
因此当在程序中贴上上图的几行代码时,其作用就是指明程序中的中文使用哪种编码存储到Unicode中
QT(桌面)中文显示以及乱码解决
自己的Qt中没有对应的汉字库,以至于没法显示中文,原因是开始在编译Qt时没有加上下面的参数
解决方法:重新编译Qt库
配置:./configure -fontconfig
编译:make
安装:make install
测试:重新编译完成后,进入到Qt安装目录下的bin目录下,运行./qtconfig,在出现的界面中选择font,字体出现wenquan***的字体,说明安装成功。然后设置了这个字体,中文就显示出来了
至于乱码,则贴上上图的代码就可以了。
QT(嵌入式)中文显示以及乱码解决
我遇到的主要是中文显示的问题,刚开始开发板的屏幕上没有一个汉字,乱码也没有。我就知道是字库的问题。下载了文泉驿的字体放到了../font文件夹下面也不行(此文件夹下有好多的字体),最后将此文件夹下的字体删除至只剩下一种,文字就显示出来了。经过一步步测试,最终找到原因:没有设置使用哪种字体。因为这个程序是以前公司的人写的,让我调试Bug,坑人。那么为什么程序没有确定选择使用哪种字体时,只有一种字体就会显示中文,而多种字体之后就不会显示字体呢?
这个问题我没有去找答案。可能是因为是:多种字体的时候,程序无法确定使用哪种字体的缘故吧。
参考资料:
百度百科:http://baike.baidu.com/subview/126558/5073178.htm
字符常见的几种编码方式:http://blog.csdn.net/csywwx2008/article/details/17137097
qt中文乱码问题:http://blog.csdn.net/brave_heart_lxl/article/details/7186631
(原创)QT 4.7支持中文(QT4.7)(中文)(makeqpf)http://www.cnblogs.com/liu_xf/archive/2011/07/05/2098144.html