将UTF-16 QByteArray转换为QString

5

我有一个QByteArray,其中包含UTF-16格式的字节。

一个Java程序通过套接字向QT程序发送数据,使用的是

//dos is DataOutPutStream
dos.writeChars("hello world");

在QT程序的接收端,我将数据从套接字中读取到QByteArray中,并希望将其转换为QString。检查QByteArray的数据变量时,它显示为0h0e0l0l0o0 0w0o0r0l0d。
当我尝试像这样制作一个QString时:
QString str(byteArray)

结果字符串为空,可能是因为在开头遇到了0字节,当然也可能是因为我正在使用的构造函数的文档说明它内部使用fromAscii,并且我传递的不是ascii。

我想我必须以某种方式使用QString::fromUTF-16,但这需要一个ushort*,而我有一个QbyteArray。

请建议最佳方法。

谢谢。

2个回答

4

我不确定QbyteArray中的数据是否类似于0h0e0l0l0o0 0w0o0r0l0d - 请注意末尾没有空字符...因此我在QString :: fromUTF-8中手动指定了第二个参数作为大小,但是结果相同。我的平台是Windows 7。 - Ahmed
看起来你说得对,我创建了一个临时的 QString 对象,并将其转换为 QByteArray,就像这样:QByteArray b((const char*)(s.utf16()), s.size() * 2);内容类似于 t 0 e 0 s 0 t 0。那我该如何修复这个问题呢? - Ahmed
使用 ntohs(uint16_t net) - 你可能需要包含网络头文件,我不记得是否有一个qt函数可以实现它。 - Martin Beckett
我很困惑为什么网络会改变数据的字节顺序?我以为网络中的字节顺序只与端口和地址有关?所以ntohs之类的东西可能只适用于端口和地址,而不是数据 :( - Ahmed
1
终于解决了,dos.writeChars("hello world"); 显式地写成了大端字节序,尽管该平台的本机字节序是小端。我现在将字节从Java发送,转换为UTF-16,这是小端字节序,并且在QT中翻译得很好。感谢您的帮助。 - Ahmed
显示剩余2条评论

3

假设您的UTF-16数据具有相同的字节序或带有BOM(字节顺序标记),那么这将起作用:

QByteArray utf16 = ....;
auto str = QString::fromUtf16(
                reinterpret_cast<const ushort*>(utf16.constData()));

请查看此处:https://dev59.com/RmYq5IYBdhLWcg3w30Xc#14131215 - FlKo
为什么要在“QString”可以自己处理时使用重型(通常基于ICU的)文本编解码器? - Kuba hasn't forgotten Monica
只是在存在不同字节序或字节序未知的情况下需要进行补充。对于标准情况,你的例子应该能够完美地运行。 - FlKo
未知的字节序与系统不同,因为任何假设都有50%的可能性是错误的,所以没有地方处理它。已知的字节序通过BOMs声明,可以被fromUtf16很好地处理。QString原生支持utf16是有原因的:必须拉取非常庞大(几兆字节!)的ICU或类似机制才能完成QString上标注的工作,这将是相当愚蠢的。 - Kuba hasn't forgotten Monica
@ Kuba Ober 您肯定是对的,所以我在这里没有什么可补充的。 - FlKo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接