Qt学习之路【1】:QT显示中文问题

最近,公司项目的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

时间: 2024-10-13 18:50:22

Qt学习之路【1】:QT显示中文问题的相关文章

Qt 学习之路 :Qt Quick Controls

自 QML 第一次发布已经过去一年多的时间,但在企业应用领域,QML 一直没有能够占据一定地位.很大一部分原因是,QML 缺少一些在企业应用中亟需的组件,比如按钮.菜单等.虽然移动领域,这些组件已经变得可有可无,但在桌面系统中依然不可或缺.为了解决这一问题,Qt 5.1 发布了 Qt Quick 的一个全新模块:Qt Quick Controls.顾名思义,这个模块提供了大量类似 Qt Widgets 模块那样可重用的组件.本章我们将介绍 Qt Quick Controls,你会发现这个模块与

Qt 学习之路 :Qt 绘制系统简介

Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类. QPainter用来执行绘制的操作:QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间:QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口.QPaintEngine类应用于QPainter和QPaintDevice

Qt 学习之路:Qt 简介

Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个“一站式”的解决方案:不再需要研究 STL,不再需要 C++ 的<string>,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为 Qt 自己内置了这些技术. Qt 是一个跨平台的框架.跨平台 GUI 通常有三种实现策略: API 映射:API 映射是说,界面库使用同一套 API,将其映射到不同的底层平台上面.大

Qt 学习之路 :Qt 线程相关类

希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必要再三强调使用线程一定要万分小心,一不留神就会陷入陷阱. 事实上,Qt 对线程的支持可以追溯到2000年9月22日发布的 Qt 2.2.在这个版本中,Qt 引入了QThread.不过,当时对线程的支持并不是默认开启的.Qt 4.0 开始,线程成为所有平台的默认开启选项(这意味着如果不需要线程,你可以

Qt学习之路

  Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt中statusBar,MessageBox和Timer的简单处理) Qt学习之路_9(Qt中Item Widget初步探索) Qt学习之路_8(Qt中与文件目录相关操作) Qt学习之路_7(线性布局和网格布局初步探索) Qt学习之路_6(Qt局域网聊天软件) Qt学习之路_5(Qt TCP的初步使用) Qt学习之路

QT学习之路--创建一个对话框

Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学习之路:Qt学习之路(7):创建一个对话框(上)这个程序.编译出现 invalid use of incomplete type ‘class QPushButton’ findButton->setEnabled(!text.isEmpty()); ^ In file included from

Qt 学习之路 2 --- 读书笔记

一.文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二.读书笔记 1.Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C++ 应用程序框架.但并不只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个"一站式"的解决方案:不再需要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为

QT学习之路(1):彩票绝对不中模拟器

//============================================//绝对不中,彩票开奖模拟器#include "mainwindow.h"#include "ui_mainwindow.h"#include <QHash>#include <QDebug>MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::M

qt学习(一)qt三个文件函数的框架

学到点什么, 而不是复制着什么, 每天敲着别人给的代码,苦涩得改完bug, 就这样一天天的过去, 实质上并没有学到什么, 别人的思想只是拿来借鉴, 你的思想是好是坏都是你的, 不用急着抛弃自己. 从qt看看人家的思路. Qt编程思路: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 以下:xxx.h ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~