从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式(在源码里写非英文,官方推荐“\xE4\xBD...”这种)good
2017-02-07 19:15
1216 查看
[cpp] view plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
网上很多人一碰到编码问题就无脑的Copy上面3行……
从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式
[cpp] view plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
{
// 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")"即可。不用再做上面的转义了。
http://blog.csdn.net/aqtata/article/details/9184741
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
网上很多人一碰到编码问题就无脑的Copy上面3行……
从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式
[cpp] view plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
{
// 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")"即可。不用再做上面的转义了。
http://blog.csdn.net/aqtata/article/details/9184741
相关文章推荐
- 从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式
- Qt5 取消了QTextCodec::setCodecForTr()和QTextCodec::setCodecForCString()这两个函数。
- Qt之setCodecForLocale
- Qt5 取消了QTextCodec::setCodecForTr()和QTextCodec::setCodecForCString()这两个函数。
- qt5 相关英文书 Qt5 Cadaques 推荐
- Python3学习(一)-基础、数据类型、变量、字符串和编码、list&tuple、if、for、while、dict、set、函数与参数
- 第0章-可以在smart210上应用的dnw for linux源码----这只是个开始
- setCodecForCString setCodecForTr setCodecForLocale
- Qt5位置相关函数异同详解(附源码)
- Qt使用一个事件队列对所有发出的事件进行维护(QObject的event()函数相当于dispatch函数),用EventLabel 继承QLabel作为例子(简单明了) good
- 彻底弄懂Qt的编码(汉字乱码问题及相关函数作用)
- 【MyEclipse】我们导入的jar包后, 一般没有关联源码, 需要手动进行关联!推荐这种方式。
- 彻底弄懂Qt的编码(汉字乱码问题及相关函数作用)
- 如何配置一个绿色化的 Qt for Windows 开发环境(有.bat脚本,亲测好用) good
- 彻底弄懂Qt的编码(汉字乱码问题及相关函数作用)
- Qt5与Qt4差别:在Qt5中QTextCodec中的setCodecForTr等消失了
- Qt国际化相关类(以前没见过codec->toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())
- Qt5位置相关函数异同详解(附源码)
- Qt 汉字显示问题//QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
- 设计函数,输入为一个字符串,里边包含中文、英文、数字等字符,编码为GBK。中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意。