【问题标题】:Write Unicode UTF-8 and UTF-16 data into a QByteArray将 Unicode UTF-8 和 UTF-16 数据写入 QByteArray
【发布时间】:2012-06-24 13:05:52
【问题描述】:

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

  1. 如何将QString中的数据以Unicode 8位格式转换为QByteArray(规范说字符类型对应quint8)?

  2. 如何将QString中的数据以Unicode 16位格式(规范说字符类型对应quint16)转换为QByteArray

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

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

【问题讨论】:

  • 没有 8 位或 16 位 Unicode 字符。 Unicode 是 21 位代码。您是否参考了 UTF-8 和 UTF-16(它们使用 8 位或 16 位代码 units 来表示 Unicode code points)?
  • @Joey 也许这就是规范的意思(你写的),但这就是它所说的方式(我写的)。照你说的做就是必须的,我该怎么做?
  • @ustulation 两者都比不回答问题更可取。

标签: c++ qt encoding windows-xp utf


【解决方案1】:

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

  1. QString::toUtf8()
  2. 创建一个以BOM 开头的新QByteArray。使用 QString::utf16() 获取 ushort 值,将您想要的字节序的上半部分和下半部分屏蔽到 QByteArray 中。
  3. UTF-8 没有/不需要字节序。将 16 位值放入 8 位数组以实现小字节序所需的 ushort 掩码将是 0x00FF,然后是 0xFF00
  4. 今晚在家看The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

【讨论】:

  • 我自己再好不过了。一个优秀的答案! [自己急于打印“绝对最小值……”]
【解决方案2】:

对于你的问题#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 进行了测试。

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 2012-07-02
    • 2012-02-22
    • 1970-01-01
    • 2017-01-20
    • 2012-10-08
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多