Ich habe Probleme mit QByteArray
und QString
.
Ich lese eine Datei und speichert ihre Informationen in einer QByteArray
. Die Datei befindet sich im Unicode-Format und enthält daher etwa Folgendes: t\0 e\0 s\0 t\0 \0 \0
Ich versuche, diesen Wert mit meinem angegebenen Wert zu vergleichen, schlägt jedoch fehl, da im Debugger keine Unicode-Zeichenfolge angezeigt wird.
Der Code wird alles erklären:
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.
Im Debugger wird angezeigt, dass die Variable Data
den Wert "t\0 e\0 s\0 t\0 \0 \0"
und myValue
den Wert "test"
hat. Wie kann ich es reparieren?
Sie können QTextCodec verwenden, um den Bytearray in einen String zu konvertieren:
QString DataAsString = QTextCodec::codecForMib(1015)->toUnicode(Data);
(1015 ist UTF-16, 1014 UTF-16LE, 1013 UTF-16BE, 106 UTF-8)
In Ihrem Beispiel können Sie sehen, dass die Zeichenfolge "test"
in Ihrer Codierung als "t\0 e\0 s\0 t\0 \0 \0"
codiert ist, d. H. Auf jedes ASCII-Zeichen folgt ein \0
-Byte. Jedes ASCII-Zeichen wird als 2 Byte codiert. Die einzige Unicode-Codierung, bei der ASCII-Buchstaben auf diese Weise codiert werden, ist UTF-16 oder UCS-2 (eine eingeschränkte Version von UTF-16). In diesem Fall ist die 1015-Mib erforderlich wie bei der Eingabe endianess).
sie können QString::fromAscii()
verwenden
QByteArray data = entity->getData();
QString s_data = QString::fromAscii(data.data());
mit data()
einen char*
zurückgeben
für QT5 sollten Sie stattdessen fromCString()
verwenden, da fromAscii()
veraltet ist, siehe https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872
Sie können verwenden:
QString::fromStdString(byteArray.toStdString())
QString :: fromUtf8 () kann ebenfalls nützlich sein.
Für QByteArray input
von "\010"
und "\000"
wird QString :: fromLocal8Bit (Eingabe 1) zurückgegeben "\010"
und ""
, aber QString :: fromUtf8 (Eingabe 1) wird "\010"
und "\000"
korrekt zurückgegeben.
Verwenden Sie QString::fromUtf16((ushort *)Data.data())
wie im folgenden Codebeispiel gezeigt:
#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();
}
Dies ist eine alternative Lösung zu der, die QTextCodec verwendet. Der Code wurde mit Qt 5.4 getestet.
Sie können diesen QString-Konstruktor für die Konvertierung von QByteArray in QString verwenden:
QString (const QByteArray & ba)
QByteArray data;
QString DataAsString = QString(data);