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及之后上面红色标注的两行已经取消掉了,以为这两行代码会产生很大的副作用,具体有什么副作用我也不太懂。故只需使用:
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