Qt编码的一个坑

编码编码

虽说上班这么多年了,昨天修复一个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来转,也会出现乱码或者丢数据,慎用慎用!


文章作者: 张小飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 张小飞 !
 上一篇
Unicode字符范围 Unicode字符范围
https://blog.csdn.net/m372897500/article/details/37592543 十进制 十进制 十六进制 十六进制 字符数 编码分类(中文) 编码分类(英文) 起始 终止 起始 终止 (个)
2020-06-27 张小飞
下一篇 
windows快速添加文件夹 windows快速添加文件夹
for /l %i in (1,1,1000) do mkdir %i
2020-06-27 张小飞
  目录