qt creator开发qtGui工程时,界面中文显示乱码,可以通过以下过程解决:
1.在main()文件开始处,添加头文件#include
2.在main()函数体中,添加如下代码:
[cpp] view plain copy
1. // 以下部分解决中文乱码
2. QTextCodec *codec = QTextCodec::codecForName("GBK");
3. QTextCodec::setCodecForTr(codec);
4. QTextCodec::setCodecForLocale(codec);
5. QTextCodec::setCodecForCStrings(codec);
6. // 以上部分解决中文乱码
3.代码位置在QApplication...之后
[cpp] view plain copy
1. int main(int argc, char *argv[])
2. {
3. QApplication a(argc, argv);
4.
5. // 以下部分解决中文乱码
6. QTextCodec *codec = QTextCodec::codecForName("GBK");
7. QTextCodec::setCodecForTr(codec);
8. QTextCodec::setCodecForLocale(codec);
9. QTextCodec::setCodecForCStrings(codec);
[cpp] view plain copy
1.
[cpp] view plain copy
1. "white-space:pre;"> //其他代码
[cpp] view plain copy
1. }
一、Qt环境设置
文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.
Windows环境下,QtCreator,菜单->工具->选项->文本编辑器->行为->文件编码:
默认编码: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 *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: 常量中有换行符 |
编译失败 |
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 |
五、结论
Windows环境下,Qt Creator+微软VS编译器,新建工程,
1、如果该工程不需要跨平台使用(只在win),那么工程设置请使用GBK的编码方式.
2、如果该工程要跨平台使用(win+linux),那么工程设置请使用UTF-8+BOM的编码方式.
Linux环境下,QtCreator+gcc,新建工程,没有GBK编码可选,默认是UTF-8(无BOM)编码方式,考虑到跨平台,建议选择UTF-8+BOM的编码方式.