QT解决中文乱码问题(1)

转载 2015年11月17日 18:36:23
 

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

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


一、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 5.x中出现中文乱码的解决方法

Qt 5.x中出现中文乱码的解决方法中文乱码的问题,相信每个程序员都会遇到,并非Qt的特有,只是在使用Qt进行开发的过程中,总感觉有一种我去,Qt的字符串处理和编码以及国际化这些内容都做得挺好的,给我...

Qt中文乱码问题解决办法【转】

也许你在用这个方法实现中文化,但它确实不够严谨Laguage» C++ Title» 出现频率最高的办法#include    int main(int argc, char *argv[])  { ...

QT5 +VS2010 SP1 解决中文乱码问题

QStringLiteral似乎解决解决显示中文的问题.所以不管是显示,还是使用QFile, QTextStream写入文件,在所有的文字前面都使用这个东西QStringLiteral就万无一失了。 ...

QT5 +VS2010 SP1 解决中文乱码问题

qt4和VS2008的中文支持,大家都知道的。就不说了。 qt5.2.1发布后,源码全部是UTF-8编码,但由于微软的问题,VS2010打上补丁VS2010sp1,加入#pragma executio...

qt中文乱码问题(1)

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

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

一、Qt环境设置 Qt Creator,菜单->工具->选项->文本编辑器->行为->文件编码: 默认编码:System(简体中文windows系统默认指的是GBK编码,即下拉框选项里的GBK/win...

Qt与MSVC中文乱码问题的解决方案

一、问题是什么? 在学习Qt编程的过程中,大多数人都遇到过中文乱码的问题。总结起来有三类: 1. Qt Creator中显示的汉字变为乱码,编辑器上方有“Could not decode ...

VS2013+QT5.5 中文乱码问题 解决方案

本方案适用于VS2013+QT5.5环境(编译器是VC) 直接输出字符串是没问题了,但遇到char*[]这样的字符数组的时候显示中文还是会有问题,应该是VS环境下默认是GBK编码 在MAIN...

Qt中文乱码问题解决办法

也许你在用这个方法实现中文化,但它确实不够严谨Laguage» C++ Title» 出现频率最高的办法#include    int main(int argc, char *argv[])  { ...

Qt下中文乱码问题的解决办法

Qt在设计开始就考虑了对多语言的支持.因此对中文的支持还是比较容易.很容易编写出多语言的程序来.关于Qtopia /QT的中文支持.主要有如下情况   1.在自己的QT程序中加入中文支持.   2...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT解决中文乱码问题(1)
举报原因:
原因补充:

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