1

我正在使用 Qt 为我的公司开发一个协议。需要查询 Window Registry 并将获得的值写入预先协商的套接字中。我已将注册表数据读入QString. 我必须使用 8 位 Unicode 字符和一些 16 位 Unicode 字符。我使用QByteArray在写入套接字之前存储所有数据QTcpSocket::write()。必须遵循 Little Endianness。

  1. 如何以 Unicode 8 位格式获取数据QStringQByteArray规范说字符类型对应于quint8)?

  2. 如何以 Unicode 16 位格式获取数据QStringQByteArray规范说字符类型对应于quint16)?

  3. 如何在所有情况下都保持 Little Endianness?

(我没有处理 Unicode/可变字节编码数据的经验)

4

2 回答 2

5

查看文档是一个好的开始。

  1. QString::toUtf8()
  2. 创建一个以BOM开头的新 QByteArray 。使用QString::utf16()获取 ushort 值,将您想要的字节序的上半部分和下半部分屏蔽到 QByteArray 中。
  3. UTF-8 没有/不需要字节序。将 16 位值放入 8 位数组以实现小字节序所需的 ushort 掩码将0x00FF0xFF00.
  4. 今晚在家里阅读每个软件开发人员绝对、绝对必须了解 Unicode 和字符集(没有借口!)的绝对最低要求。
于 2012-06-22T09:18:56.413 回答
1

对于您的问题 #2 - How to convert QString to UTF-16 QByteArray,有一个使用 QTextCodec::fromUnicode() 的解决方案,如以下代码示例所示:

#include <QCoreApplication>
#include <QTextCodec>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // QString to QByteArray
    // =====================

    QString qstr_test = "test"; // from QString
    qDebug().noquote().nospace() << "qstr_test[" << qstr_test << "]";     // Should see: qstr_test[test]

    QTextCodec * pTextCodec = QTextCodec::codecForName("UTF-16");

    QByteArray qba_test = pTextCodec->fromUnicode(qstr_test); // to UTF-16 QByteArray
    qDebug() << "qba_test[";
    int test_size = qba_test.size();
    for(int i = 0; i < test_size; ++i) { // Should see each UTF-16 encoded character per line like this: ÿþt e s t
        qDebug() << qba_test.at(i);
    }
    qDebug() << "]";

    return a.exec();
}

上面的代码已经使用 Qt 5.4 进行了测试。

于 2015-05-28T16:32:13.990 回答