QByteArray
とQString
に問題があります。
ファイルを読み込んで、その情報を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"
。どうすれば修正できますか?
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が必要です(ローカルエンディアンが入力エンディアンと同じ)。
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
次を使用できます。
QString::fromStdString(byteArray.toStdString())
QByteArrayからQStringへの変換には、このQStringコンストラクターを使用できます。
QString(const QByteArray&ba)
QByteArray data;
QString DataAsString = QString(data);
QString :: fromUtf8() も便利だと思うかもしれません。
ために QByteArray input
of "\010"
および"\000"
、 QString :: fromLocal8Bit(input、1) 返された"\010"
および""
、しかし QString :: fromUtf8(input、1) は正しく返された"\010"
および"\000"
。
次のコード例に示すように、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を使用してテストされています。