解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
来源:互联网 发布:动漫头像下载软件 编辑:程序博客网 时间:2024/06/05 11:07
一、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
情况2UTF-8(无BOM)
win vs cl
编译失败
error C2001: 常量中有换行符
编译失败
error C2001: 常量中有换行符win mingw-g++
情况2
情况1linux g++
情况2
情况1
UTF-8(有BOM)
win vs cl
情况1
情况2win mingw-g++
情况2
情况1linux 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中文乱码以及汉字编码的问题(UTF-8/GBK)
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换
- HttpURLConnection以及GBK转UTF-8中文部分乱码问题
- 解决utf-8和GBK中文乱码问题
- rtf 中处理中文乱码以及utf-8 gbk 所占字节的问题
- Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 乱码与转码问题
- 解决中文字符乱码问题,如何将gbk格式转换utf-8格式
- http程序中:UTF-8转GBK解决中文乱码问题
- convmv 解决GBK 迁移到 UTF-8 ,中文 文件名乱码
- 理解并解决GBK转UTF-8奇数中文乱码
- convmv 解决GBK 迁移到 UTF-8 ,中文 文件名乱码
- prototypes JSON 中文乱码问题 (UTF-8 GB2312 GBK)
- 解决UTF-8和GBK之间转换乱码问题
- ZF解决中文UTF-8乱码问题
- xcode显示空格字符的解决办法
- FPGA图像处理项目(一)--FIFO与FFT
- 移动互联网时代的杀手级应用是什么?
- Android中关于Adapter的使用(中)SimpleAdapter
- 用 GStreamer 简化 Linux 多媒体开发
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
- 数据结构上机测试2-1:单链表操作A
- You are my brother
- 调试rsyslog的一点心得
- 高手速成android开源项目【View篇】
- java-04面向对象的三大特征
- 些基础的 Linux 问题与讨论:
- Time
- linux环境下玩转stm32f4 discovery开发