编码编码
虽说上班这么多年了,昨天修复一个bug的时候还是被屎一样的代码给坑了
先说逻辑
业务本质是想把 Unicode编码转成GBK编码
QTextCodec* codec = QTextCodec::codecForName("GBK");
ushort ss = 23435;
QString strUn = QString::fromUtf16(&ss, 1);
if (codec && codec->canEncode(strUn))
{
QString gStr = codec->fromUnicode(strUn);
std::string = gStr.toStdString();
}
在某些unix环境中,这个gStr就已经是空的了。
原因是 codec->fromUnicode(strUn); 返回的是QByteArray。
QByteArray转QString是调用的Qt的fromAscii_helper这个函数,也就是本次是gdk又强转了一次latin的编码,导致丢数据。
Qt中的转化代码是走的这里。 敲重点,目前QByteArray是gbk编码,但是这样强转会当做Ascii来解析,所以出现了丢数据。
Qt源码
QString::Data *QString::fromAscii_helper(const char *str, int size)
具体到WPS的某个功能的话我就懒得吐槽了,反正这么多年windows也一直没事儿。逃)
toStdString
这个函数也慎用,不管你是啥编码的QString,这样导出最后也是会当做ascii来转,也会出现乱码或者丢数据,慎用慎用!