【发布时间】:2019-01-31 17:43:41
【问题描述】:
我给出了一个需要支持波斯语的 Qt 项目。数据是从服务器发送的,使用第一行,我得到一个 QByteArray 并使用第二行将其转换为 QString:
QByteArray readData = socket->readAll();
QString DataAsString = QTextCodec::codecForUtfText(readData)->toUnicode(readData);
当发送的数据是英文时,一切都很好,但是当它是波斯语时,而不是
سلام
我明白了
سÙ\u0084اÙ\u0085
我提到了这个过程,所以人们不会建议制作使用 .tr 的多语言应用程序的方法。一切都与文本和解码有关,而不是那些翻译方法。我的操作系统是 Windows 8.1(你需要知道的情况)。
当服务器发送 سلام 时,我得到这个十六进制值
0008d8b3d984d8a7d985
顺便说一下,服务器在开头发送了两个额外的字节,原因我不知道。所以我把它切断了:
DataAsString.remove(0,2);
在它被转换为 QString 之后,十六进制值在乞求时有一些额外的。
【问题讨论】:
-
改用
QString DataAsString = QString::fromUtf8(readData)。codecForUtfText查找字节顺序标记,但没有找到并假定为 Latin-1 编码。 -
@IgorTandetnik 感谢您的回复。我尝试了您的代码,它给了我“”。您自己尝试了吗?请告诉我。
-
能否将
readData的值发布为十六进制值? -
@scopchanov 基于我的浏览器和 Notepad++ 支持 UTF-8(或其他兼容的 Unicode 编码)这一事实,我已将文本“سلام”放入 Notepad++。 hexdump 产生“d8 b3 d9 84 d8 a7 d9 85”。 (我也想复制相应的 Latin-1 输出,但 Notepad++ 在我完成之前就死了。)
-
请使用
QByteArray::toHex()将您的dataRead转换为十六进制转储,打印并将结果添加到您的问题中(使用edit)。如果它与我在 Notepad++ 中得到的相同,那么您的编码是 UTF-8。如果是不同的东西,也许有人可以从数字中猜到。