维护公司代码时看到一个工具出现了如下的乱码:
于是开始检查代码,借此机会理了一遍char *、QString、GB18030、UTF8之间的关系。
这里出现乱码的原因是:由SDK接口得到一个包含中文的char[]字符串:
char byName[NAME_LEN];
这个字符串存储的中文为GB18030格式保存,对于Qt5.8.0来说,默认设置本地字符编码为UTF8、默认设置QString编码为UTF8,如果直接使用:
QString str_trans=QString::fromLocal8Bit(byName);
qDebug()<<str_trans;
实际的操作就是从本地字符编码UTF8格式转换为QString编码UTF8,字符串没有转换,出现乱码。
要解决这个问题需要设置一下本地字符编码,在QString str_trans=QString::fromLocal8Bit(byName);之前加上:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));
再输出就能正常显示中文了,实际的操作为从本地字符编码GB18030转换为QString编码UTF8。
然而这还没完,由于其他地方的char[]存储的中文是UTF8格式的,也用到了QString::fromLocal8Bit(),这下的实际操作还是从本地字符编码GB18030转换为QString编码UTF8,这样就把正常的UTF8转成了乱码。
解决方法为重新设一遍本地编码格式,总结起来代码如下:
char byName[NAME_LEN];
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));//需要从GB18030编码的char[]字符串提取中文
QString str_trans=QString::fromLocal8Bit(byName);
...
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));//不再需要从GB18030编码的char[]字符串提取中文