50

とに問題がQByteArrayありQStringます。

私はファイルを読んでいて、その情報をに保存していますQByteArray。ファイルはUnicodeであるため、次のようなものが含まれています。t\0 e\0 s\0 t\0 \0 \0

この値を指定した値と比較しようとしていますが、デバッガーでユニコード文字列ではないことがわかるため、失敗します。

コードはすべてを説明します:

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"。どうすれば修正できますか?

4

7 に答える 7

40

このQStringコンストラクターを使用して、QByteArrayからQStringに変換できます。

QString(const QByteArray&ba)

QByteArray data;
QString DataAsString = QString(data);
于 2019-01-11T23:07:54.783 に答える
29

QTextCodecを使用して、bytearrayを文字列に変換できます。

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バイトまたはrespが続きます。すべてのASCII文字は2バイトとしてエンコードされます。アスキー文字がこのようにエンコードされる唯一のUnicodeエンコードは、UTF-16またはUCS-2(UTF-16の制限付きバージョン)であるため、この場合は1015 mibが必要です(ローカルエンディアンが入力エンディアンと同じ)。

于 2013-01-03T00:05:53.010 に答える
28

次を使用できます。

QString::fromStdString(byteArray.toStdString())
于 2017-12-08T11:54:20.887 に答える
14

あなたが使用することができますQString::fromAscii()

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

data()返すとchar*

QT5の場合は、非推奨になっているfromCString()ように、代わりに使用する必要があります。httpsfromAscii() ://bugreports.qt-project.org/browse/QTBUG-21872https://bugreports.qt.io/browse/QTBUG-21872を参照してください

于 2013-11-13T13:25:42.873 に答える
9

QString :: fromUtf8()も役立つ場合があります。

QByteArray input"\010"の場合"\000"

QString :: fromLocal8Bit(input、1)"\010"""

QString :: fromUtf8(input、1)は正しく"\010"とを返します"\000"

于 2016-07-22T15:59:37.260 に答える
5

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を使用するソリューションの代替ソリューションです。コードはQt5.4を使用してテストされています。

于 2015-05-28T01:00:02.493 に答える
0

Qt 5.12以降:

QString::fromStdString(byteArray.toStdString());
于 2020-03-04T12:04:37.883 に答える