【问题标题】:QByteArray to QStringQByteArray 到 QString
【发布时间】:2012-12-17 08:32:36
【问题描述】:

我遇到了QByteArrayQString 的问题。

我正在读取一个文件并将其信息存储在QByteArray 中。该文件是 unicode 格式,因此它包含如下内容:t\0 e\0 s\0 t\0 \0 \0

我正在尝试将此值与我指定的值进行比较,但它失败了,因为在调试器中我看到它不是一个 unicode 字符串。

代码将解释一切:

QByteArray Data; //contains unicode string "t\0 e\0 s\0 t\0 \0 \0"
QString myValue = "test"; //value to compare.
if(Data.contains(myValue))
    //do some stuff.
else
    //do other stuff.

在调试器中,它显示变量 Data 的值是 "t\0 e\0 s\0 t\0 \0 \0"myValue 的值是 "test"。我该如何解决?

【问题讨论】:

  • 请注意,自 Qt 5.0 起字符串处理发生了变化。字符数组在内部被解释为 UTF-8 编码。 QString myValue = "äöü";例如,至少如果它自己的源文件不是以 UTF-8 存储的,则应避免使用。请查看wiki.qt.io/Strings_and_encodings_in_Qt 了解更多信息。

标签: c++ qt qstring qtcore qbytearray


【解决方案1】:

您可以使用此 QString 构造函数将 QByteArray 转换为 QString:

QString(const QByteArray &ba)

QByteArray data;
QString DataAsString = QString(data);

【讨论】:

  • 这应该是公认的答案。功能更简单(让Qt自动处理转换)
【解决方案2】:

您可以使用QTextCodec 将字节数组转换为字符串:

QString DataAsString = QTextCodec::codecForMib(1015)->toUnicode(Data);

(1015 是 UTF-16,1014 是 UTF-16LE,1013 是 UTF-16BE,106 是 UTF-8)

从您的示例中,我们可以看到字符串"test" 在您的编码中被编码为"t\0 e\0 s\0 t\0 \0 \0",即每个ascii 字符后跟一个\0-byte,或resp。每个 ascii 字符都被编码为 2 个字节。以这种方式编码 ascii 字母的唯一 unicode 编码是 UTF-16 或 UCS-2(这是 UTF-16 的受限版本),因此在您的情况下需要 1015 mib(假设您的本地字节序是与输入字节序相同)。

【讨论】:

  • 不知道为什么这是一个如此受欢迎的回复。这是一个不寻常的解决方案,大多数人使用并且应该使用。将它与通常的转换方法一起提供会是一个很好的回答,但就其本身而言,它很奇怪。
  • @LaszloPapp:你的意思是QString::fromUTf16?这需要一个 ushort 指针,这需要一些非常丑陋的转换才能传递 QByteArray
  • @BeniBela:是的,但为什么不能是utf8?在这种情况下,为什么不建议 from/toUtf8()?
  • @LaszloPapp:因为这个例子。他想将t\0e\0s\0t\0 转换为test。如果是utf-8,就没有\0-bytes
  • @BeniBela:好的,很公平。您能否在回答中明确说明为什么建议使用 utf16?正如你所看到的,这对我来说有点不清楚。随着线程的碰撞,您还将获得更多的赞成票。 :)
【解决方案3】:

你可以使用:

QString::fromStdString(byteArray.toStdString())

【讨论】:

    【解决方案4】:

    你可以使用QString::fromAscii()

    QByteArray data = entity->getData();
    QString s_data = QString::fromAscii(data.data());
    

    data() 返回一个char*

    对于 QT5,您应该改用 fromCString(),因为 fromAscii() 已弃用,请参阅 https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872

    【讨论】:

    • *Ascii() 在 Qt 5 中已弃用!不要不要使用它。
    • 实际上他不能使用任何这个,因为他要转换utf-16,而不是ascii
    • 我似乎找不到fromCString(),您的意思是(或者自Q / A之后将方法重命名)为fromCFString()
    • 没有实际使用 fromLatin1 而不是 fromAscii
    【解决方案5】:

    您可能会发现QString::fromUtf8() 也很有用。

    对于QByteArray input 中的"\010""\000"

    QString::fromLocal8Bit(input, 1) 返回"\010"""

    QString::fromUtf8(input, 1) 正确返回"\010""\000"

    【讨论】:

      【解决方案6】:

      使用QString::fromUtf16((ushort *)Data.data()),如下代码示例所示:

      #include <QCoreApplication>
      #include <QDebug>
      
      int main(int argc, char *argv[])
      {
          QCoreApplication a(argc, argv);
      
          // QByteArray to QString
          // =====================
      
          const char c_test[10] = {'t', '\0', 'e', '\0', 's', '\0', 't', '\0', '\0', '\0'};
          QByteArray qba_test(QByteArray::fromRawData(c_test, 10));
          qDebug().nospace().noquote() << "qba_test[" << qba_test << "]"; // Should see: qba_test[t
      
          QString qstr_test = QString::fromUtf16((ushort *)qba_test.data());
          qDebug().nospace().noquote() << "qstr_test[" << qstr_test << "]"; // Should see: qstr_test[test]
      
          return a.exec();
      }
      

      这是使用 QTextCodec 的替代解决方案。该代码已使用 Qt 5.4 进行了测试。

      【讨论】:

        【解决方案7】:

        Qt 4.8

        QString(byteArray).toStdString();
        

        Qt 5.12

        byteArray.toStdString();
        

        【讨论】:

          猜你喜欢
          • 2013-12-25
          • 2018-12-22
          • 2016-11-27
          • 2017-11-04
          • 2016-10-14
          • 1970-01-01
          • 2013-10-16
          • 2017-12-18
          • 2014-08-24
          相关资源
          最近更新 更多