web-dev-qa-db-ja.com

QByteArrayからQString

QByteArrayQStringに問題があります。

ファイルを読み込んで、その情報をQByteArrayに保存しています。ファイルはユニコードなので、次のようなものが含まれます: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"。どうすれば修正できますか?

34
Nika

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

26
BeniBela

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

13
kiriloff

次を使用できます。

QString::fromStdString(byteArray.toStdString())
10
Tarek.Mh

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

QString(const QByteArray&ba)

QByteArray data;
QString DataAsString = QString(data);
6
Link H.

QString :: fromUtf8() も便利だと思うかもしれません。

ために QByteArray input of "\010"および"\000"QString :: fromLocal8Bit(input、1) 返された"\010"および""、しかし QString :: fromUtf8(input、1) は正しく返された"\010"および"\000"

4
Efreeto

次のコード例に示すように、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を使用してテストされています。

3
jonathanzh