Qt 5.5版本QString处理UTF-8特殊字符长度错误输出乱码如何修复?
问题原因
你遇到的问题核心来自两个点:
- 测试用的
𝐺、𝐷这类数学斜体字符属于Unicode辅助平面字符,码点值大于0xFFFF。Qt的QString内部采用UTF-16编码存储,每个这类字符会被拆成2个16位的QChar代理对存储,所以直接调用length()得到的是UTF-16编码单元的总数,不是实际的字符数量;直接遍历单个QChar也无法得到完整的字符,自然输出为问号。 - 标准库的
cout默认没有配置UTF-8编码输出,就算拿到完整字符也可能出现乱码。
修复方案
调整代码逻辑,按Unicode实际码点计算长度和遍历,同时更换为支持UTF-8输出的接口,修复后的参考代码如下:
#include <iostream> #include <QString> #include <QVector> using namespace std; int main() { // 如果需要统计长度和期望一致,可以先trim去掉前后空格 QString qstr = QString::fromUtf8(" 𝐺𝐷𝑃 𝑡 𝐺𝐷𝑃𝑡").trimmed(); // 转UCS4编码,数组长度就是实际Unicode字符数 QVector<uint> ucs4 = qstr.toUcs4(); cout << ucs4.size() << endl; for (uint codePoint : ucs4) { // 单个码点转QString再转UTF-8输出 cout << QString::fromUcs4(&codePoint, 1).toStdString() << endl; } return 0; }
另外还可以做两项可选配置:
- 运行前执行命令配置终端输出编码:
export LC_ALL=en_US.UTF-8 - 如果你坚持要用cout输出,可在代码开头加全局编码配置:
#include <locale> // main函数开头加 std::locale::global(std::locale("en_US.UTF-8"));
如果你不需要兼容标准输出接口,直接用Qt的qDebug()输出更简单,不需要额外配置编码。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

