Qt之解决中文乱码,字体设置

news/2024/7/3 13:36:09 标签: QT, 乱码, 字体, utf-8, GBK

Qt程序中文显示乱码的问题:

在Windows系统中QT默认都是GBK编码方式,而在Ubuntu环境设置默认是UTF-8(无BOM)编码方式。当QT程序从Ubuntu系统中转到Windows系统中运行或从Windows系统转到Ubuntu环境时就会出现程序显示乱码的问题。

在Windows系统中默认编码:System(简体中文windows系统默认指的是GBK编码,即下拉框选项里的GBK/windows-936-2000/CP936/MS936/windows-936)。

UTF-8与GBK(即ANSI)的互相转换,可以使用EditPlus工具对*.cpp,*.h和*.ui文件进行批量转换。这样就能保证QT程序中不显示乱码

UTF-8和GBK两种编码的简单说明:
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。GBK是GB2312的扩展,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名。

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312

在简体中文windows系统下,ANSI编码代表GBK/GB2312编码,ANSI通常使用0x80~0xFF范围的2个字节来表示1个中文字符。0x00~0x7F之间的字符,依旧是1个字节代表1个字符。Unicode(UTF-16)编码则所有字符都用2个字节表示。

当完成了程序编码转换问题后,在QT5.0版本之前我们通常在main()中开头加入如下代码解决中文乱码问题:

//获取GBK编码,否则移植会出现乱码
QTextCodec*codec = QTextCodec::codecForName("GBK");  //qt程序设置为GBK编码或UTF-8编码(有无ROM都可),都使用GBK

//设置和对本地文件系统读写时候的默认编码格式
 QTextCodec::setCodecForLocale(codec);

//设置传给tr函数时的默认字符串编码
QTextCodec::setCodecForTr(codec);

 //用在字符常量或者QByteArray构造QString对象时使用的一种编码方式
 
QTextCodec::setCodecForCStrings(codec); 

但在QT5.0及之后上面红色标注的两行已经取消掉了,以为这两行代码会产生很大的副作用,具体有什么副作用我也不太懂。故只需使用:

//获取GBK编码,否则移植会出现乱码

QTextCodec*codec = QTextCodec::codecForName("GBK");  //qt程序设置为GBK编码或UTF-8编码(有无ROM都可),都使用GBK

//设置和对本地文件系统读写时候的默认编码格式
 QTextCodec::setCodecForLocale(codec);

总结:

在Windows系统中QT通常使用GBK编码方式,在Ubuntu系统中QT程序通常使用UTF-8(无BOM)编码方式;若程序需要跨平台使用则程序的编码方式使用UTF-8+ROM的编码方式。本人使用UTF-8+ROM的方式,可以避免程序跨平台使用时的乱码问题。



参考文章:

http://blog.csdn.net/libaineu2004/article/details/19245205

http://blog.csdn.net/brave_heart_lxl/article/details/7186631

http://www.2cto.com/kf/201205/130731.html


http://www.niftyadmin.cn/n/1366433.html

相关文章

Ubuntu启动时进入禁止grub界面

在Ubuntu系统启动时,若中途断电会导致系统在下次启动时进入grub界面,这是就需要手动按回车键进入系统,在电脑没有键盘或者想禁止进入grub界面时可修改Ubuntu系统的配置文件使之能在进入grub界面后能自动执行进入系统。 方法一: 修…

进程间通讯的消息队列和共享内存方式的实现

消息队列模式 消息队列函数由msgget、msgctl、msgsnd、msgrcv四个函数组成: int msgget(key_t key, int msgflg):得到消息队列标识符或创建一个消息队列对象并返回消息队列标识符; int msgctl(int msqid, int cmd, struct msqid_ds *buf):获取…

vs+qt+VAssistX搭建

vs2013qt5.3.2环境搭建: http://blog.csdn.net/wangell/article/details/41117139 vs2010qt5.4VAssistX环境搭建----重要的: http://www.kavenblog.com/?p272 vsqt环境搭建VAssisX介绍----重要的: http://blog.sina.com.cn/s/blog_a6fb6c…

QT中QSignalMapper类信号转发器的使用和说明

原文地址: http://blog.csdn.net/seanyxie/article/details/7689423 http://blog.sina.com.cn/s/blog_a6fb6cc90101epbg.html http://blog.sina.com.cn/s/blog_83e4ed0e0100yutt.html http://blog.csdn.net/mcgrady_tracy/article/details/6996947

QT程序打包发布

QT程序打包发布步骤总共分两个步骤:1.将程序和使用到的库放在一个文件夹中,2.打包发布 1.查找程序使用的动态库和插件等 有两种方法查看:1.微软的Process Explorer工具查看进程使用的动态库;1.使用Dependency Walker工具查看 2.打…

QT学习之QString的arg方法

博客原文链接:http://www.cnblogs.com/lomper/p/4135387.html 在QT的QString中,arg方法类似于C中的printf中使用的格式输出符(只是有点类似)。 在QT5的帮助文档中,可以看出以下几点: 使用arg(str1, str2…

堆栈窗体QStackedWidget类

本文章转载于:http://blog.csdn.net/a649518776/article/details/6636578%5C 这些窗体都比较类似,相对简单,就没什么可以深入研究的了。 下面用代码实现上面窗口的设计: 1.建立项目时基类选择QDialog,取消Gernerate…

Qt运行一个实例进程-3种方式简介

文章转载于:http://blog.csdn.net/taiyang1987912/article/details/46989717 一:使用QLocalSocket 方式:首先一个新的实例启动时,将尝试连接到同一个本地服务器,如果连接失败,则表示第一个实例进程&#x…