【问题标题】:Converting UTF-16 QByteArray to QString将 UTF-16 QByteArray 转换为 QString
【发布时间】:2012-07-02 00:33:20
【问题描述】:

我有一个 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。

请告知最好的方法。

谢谢,

【问题讨论】:

    标签: qt unicode


    【解决方案1】:

    获取指向QByteArray.data() 的指针并将其转换为 ushort*

    【讨论】:

    • ok 函数工作但没有得到正确的 QString 。它包含有线十六进制数字
    • 我不确定 QbyteArray 中的数据是否类似于 0h0e0l0l0o0 0w0o0r0l0d - 注意末尾没有空字符...所以我在 QString::fromUTF-8 中手动指定大小作为第二个参数,但是一样。我在 Windows 7 中的平台
    • 猜你似乎是对的我创建了一个临时 QString 对象并将其转换为 QByteArray 像这样 QByteArray b((const char*) (s.utf16()), s.size() * 2);内容就像 t 0 e 0 s 0 t 0 那么我将如何解决这个问题
    • 使用ntohs(uint16_t net) - 你可能需要包含网络标头,我不记得是否有 qt 功能
    • 终于搞定了,dos.writeChars("hello world");即使该平台上的本机字节序是低字节序,也明确写为大字节序。在将它们转换为低端的 utf-16 并且它在 QT 中转换得很好之后,我现在从 java 发送字节。感谢您的帮助
    【解决方案2】:

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

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

    【讨论】:

    • @FIKo 当QString 可以自己完成时,使用繁重的(通常基于ICU)文本编解码器......为什么?
    • 只是在字节序不同或字节序未知的情况下添加。对于标准情况,您的示例应该可以完美运行。
    • 与系统不同的未知字节序不会在任何地方得到处理,因为任何假设都有 50% 的可能性是错误的。由 BOM 声明的已知字节顺序由 fromUtf16 处理得很好。 QString 原生支持 utf16 是有原因的:为了执行 QString 在盒子上写的内容,不得不拉动极其沉重(许多兆字节!)的 ICU 或类似机器是相当愚蠢的。
    • @Kuba Ober 你说的没错,所以我这里没有什么要补充的。
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 2017-08-31
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多