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

原创 2014年02月15日 16:46:22

一、Qt环境设置

文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.
Windows环境下,Qt Creator,菜单->工具->选项->文本编辑器->行为->文件编码:
默认编码:System(简体中文windows系统默认指的是GBK编码,即下拉框选项里的GBK/windows-936-2000/CP936/MS936/windows-936)


二、编码知识科普
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个字节表示。


三、编码转换
UTF-8与ANSI(即GBK)的互转,可以使用EditPlus工具"文件另存为"或者Encodersoft编码转换工具对.cpp和.h源文件文本进行批量转换.


四、Qt编码指定
Qt需要在main()函数指定使用的字符编码:

#include <QTextCodec>

QTextCodec *codec = QTextCodec::codecForName("GBK");//情况1

QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);

QTextCodec *codec = QTextCodec::codecForName("UTF-8");//情况2
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);

这里只列举大家最常用的3个编译器(微软VS的中的cl,Mingw中的g++,Linux下的g++),源代码分别采用GBK和无BOM的UTF-8以及有BOM的UTF-8这3种编码进行保存,发生的现象如下表所示。

  • 源代码的编码

    编译器

    显示正常

    显示乱码

    GBK

    win vs cl

    情况1

    情况2

    win mingw-g++

    情况1

    情况2

    linux g++

    情况1

    情况2

    UTF-8(无BOM)

    win vs cl

    编译失败

    error C2001: 常量中有换行符

    编译失败
    error C2001: 常量中有换行符

    win mingw-g++

    情况2

    情况1

    linux g++

    情况2

    情况1

    UTF-8(有BOM)

    win vs cl

    情况1

    情况2

    win mingw-g++

    情况2

    情况1

    linux g++

    情况2

    情况1

五、应用案例
QCom跨平台串口调试助手(http://www.qter.org/?page_id=203)
源代码qcom\mainwindow.cpp,aboutdialog.cpp等文件用的是UTF-8编码(无BOM);但是qcom\qextserial\*.*文件用的是ANSI编码.在linux环境编译完全OK.
笔者Windows环境的Qt Creator+微软VS编译器,环境设置用的是ANSI(即GBK)编码.编译源文件会报错.
错误提示"fatal error C1018: 意外的 #elif".


解决方法由两种:

方法1:


把qcom\的所有文件都用工具转换成ANSI编码,main()函数使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

方法2:

先把Qt Creator环境设置用的是UTF-8编码,


再把qcom\的所有文件都用工具转换成UTF-8+BOM编码,请注意,如果文件转换成UTF-8(无BOM),编译仍会失败.main()函数使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));//注意,此处仍是"GBK",不是"UTF-8"
重新编译,OK!


六、结论

Windows环境下,Qt Creator+微软VS编译器,新建工程,

1、如果该工程不需要跨平台使用(只在win),那么工程设置请使用GBK的编码方式.

2、如果该工程要跨平台使用(win+linux),那么工程设置请使用UTF-8+BOM的编码方式.

Linux环境下,Qt Creator+gcc,新建工程,

没有GBK编码可选,默认是UTF-8(无BOM)编码方式,考虑到跨平台,建议选择UTF-8+BOM的编码方式.


七、参考文献

Qt中文乱码问题http://blog.csdn.net/brave_heart_lxl/article/details/7186631

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

彻底弄懂Qt的编码(汉字乱码问题及相关函数作用)

测试1新建test工程用于测试,main.c文件内容如下:#include #include int main(int argc, char *argv[]) { QCoreApplicat...

Qt 5 中解决中文乱码的方法

Qt 5 中解决中文乱码的方法在 Qt 4 的时代,解决中文乱码挺麻烦。要考虑用的是什么编译器,具体的可以参考下面这篇文章: http://blog.csdn.net/brave_heart_lxl...

Qt5中文乱码解决方法

Qt中的中文显示,经常会出现乱码,但在UI设计界面上添加的中文是不会出现乱码的,如果你刚使用qt,那么你肯定会碰到这个问题。网上搜索一下,找到的都是这种:#include < QTextCodec >...

【Qt】Qt5中文乱码

专门找了资料,把目前测试能用的解决中文字符乱码的方法整理的一下

qt 中文乱码

qt 中文乱码 初学Linux,直接进阶QT编程。然而,第一个Demo程序就碰到了中文乱码,巨汗! 环境:1、RedHat AS52、QT4.4.03、LANG="zh_CN.GB18030"程序:....
  • mociml
  • mociml
  • 2010年04月26日 21:53
  • 10660

Qt开发中文显示乱码

为什么会出现乱码 首先,我们需要有的概念是乱码的问题是由编码和解码方式引起的。涉及到编码方式的地方有3个: 源码字符集 执行字符集 运行环境字符集 源码字符集确切的说是编译器认为源码文件的编码方式...

Qt5.5.1中文乱码解决办法

Qt5解决中文乱码问题 Qt中文乱码 中文不显示
  • jh1513
  • jh1513
  • 2016年08月26日 21:58
  • 2522

qt中文乱码问题

以下是dbzhang关于qt中文乱码问题原因的阐述,觉得不错:   首先呢,声明一下,QString 是不存在中文支持问题的,很多人遇到问题,并不是本身 QString 的问题,而是没有将自己希望...

Qt学习之路之解决中文乱码

笔者是这样在QT5下解决中乱码的。 1.在需要使用的中文的.cpp文件中, 现在对应的.h文件中添加 头文件: QTextCodec, 2.在 .cpp需要使用中文的函数中添加下面的代码: ...
  • HK_5788
  • HK_5788
  • 2014年12月27日 00:37
  • 1509

QT中输出中文乱码处理

可以使用QTextCodecs将一些本地编码的字符串转换为Unicode。假设你有一些用俄语KOI8-R编码的字符串编码,并且想要将其转换为Unicode。简单的做法就是这样:QByteArray e...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
举报原因:
原因补充:

(最多只允许输入30个字)