【Qt】字符编码、乱码的一点总结
2013-06-27 09:52
183 查看
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
网上很多人一碰到编码问题就无脑的Copy上面3行……
从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式
{ // Qt默认会使用本机编码,所以对于中文系统,下面这句设置是多余的 QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); QString str1("你好Hello"); QByteArray bLocal = str1.toLocal8Bit(); // 受setCodecForLocale影响,会转换为设定的编码。如果本机不支持指定编码,则会按toLatin1处理 QByteArray baLatin1 = str1.toLatin1(); // 不受setCodecForLocale影响,强制转换为ISO-8859-1编码 QByteArray bUtf8 = str1.toUtf8(); // 不受setCodecForLocale影响,强制转换为UTF-8编码 qDebug() << str1; // 正常,Qt会将UTF-16转换为UTF-8输出 qDebug() << baLatin1; // 乱码,用UTF-8编码输出Latin1字节流 qDebug() << bLocal; // 乱码,用UTF-8编码输出GBK字节流 qDebug() << bUtf8; // 正常,用UTF-8编码输出UTF-8字节流 QString str2 = QString::fromLocal8Bit(bLocal); qDebug() << str2; // 正常,因为上面显式指定字节流来自本机编码,而bLocal正是本机编码GBK str2 = QString::fromLatin1(bLocal); qDebug() << str2; // 乱码,bLocal是GBK编码,但却指定了以Latin1方式去读取,肯定会乱码 // 字节流来自UTF-8 str2 = QString::fromUtf8("\xE4\xBD\xA0\xE5\xA5\xBD\x48\x65\x6C\x6C\x6F"); qDebug() << str2; // 正常 // Qt默认采用UTF-8处理字符串,所以不用显式地去调用fromUtf8 str2 = QString("\xE4\xBD\xA0\xE5\xA5\xBD\x48\x65\x6C\x6C\x6F"); qDebug() << str2; // 正常 }
在Qt中,QString会用UTF-16编码存储,而qDebug()等I/O函数会以UTF-8编码处理。
其实转换后的字节流是正确的,只是显示时用了和字节流不同的编码方式处理导致乱码
所以当要在Qt中输入输出非UTF-8字符串时应该先转换一下
在源码中要写入非英文字符的话建议使用转义的方式,也就是上面“\xE4\xBD...”这种,这也是官方推荐的方式
为了方便将字符串转换为UTF8转义字符,写了一个小工具
http://download.csdn.net/detail/aqtata/5596247
2014-5-6补充:
从vs2010sp1和vs2013开始就已经支持UTF-8的源码文件了,只用在工程里加入一句"#pragma execution_character_set("UTF-8")"即可。不用再做上面的转义了。
相关文章推荐
- 【Qt】字符编码、乱码的一点总结
- 【Qt】字符编码、乱码总结
- qt 的一点总结
- 学习QT的一些相关博客和自己的一点总结
- python中文字符编码decode,encode以及乱码解决总结
- 数据库SQLite在Qt5+VS2012使用规则总结---中文乱码
- python 字符编码处理问题总结 彻底击碎乱码!
- 关于Java中字符编码的一点总结
- Qt的一点总结
- 关于编译Qt以及驱动的一点总结吧 - Rollen Holt - 博客园
- python 字符编码处理问题总结 彻底击碎乱码!
- python中文字符编码decode,encode以及乱码解决总结
- qt sort编码的一点总结
- python中文字符编码decode,encode以及乱码解决总结
- javaweb开发中关于字符编码出现乱码问题的总结
- QT中文乱码总结
- QT 总结(一)(1.某位设1或0 2.加载dll、lib库 3.char * 转换为 wchar_t * 4.textBrowser 显示乱码 追加 5.checkBox的使能)
- QT 总结(四) 1.中文编码 乱码 2.QFileDialog 打开文件框 3.调用其它UI文件 4.QMessageBox弹窗
- 数据库SQLite在Qt5+VS2012使用规则总结---中文乱码
- QT 总结(四) 1.中文编码 乱码 2.QFileDialog 打开文件框 3.调用其它UI文件 4.QMessageBox弹窗