- QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
- QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
- QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
网上很多人一碰到编码问题就无脑的Copy上面3行……
从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式
- {
-
- QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
-
- QString str1("你好Hello");
- QByteArray bLocal = str1.toLocal8Bit();
- QByteArray baLatin1 = str1.toLatin1();
- QByteArray bUtf8 = str1.toUtf8();
- qDebug() << str1;
- qDebug() << baLatin1;
- qDebug() << bLocal;
- qDebug() << bUtf8;
-
- QString str2 = QString::fromLocal8Bit(bLocal);
- qDebug() << str2;
-
- str2 = QString::fromLatin1(bLocal);
- qDebug() << str2;
-
-
- str2 = QString::fromUtf8("\xE4\xBD\xA0\xE5\xA5\xBD\x48\x65\x6C\x6C\x6F");
- qDebug() << str2;
-
-
- 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")"即可。不用再做上面的转义了。
http://blog.csdn.net/aqtata/article/details/9184741
从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式(在源码里写非英文,官方推荐“\xE4\xBD...”这种)good
原文:http://www.cnblogs.com/findumars/p/6375633.html