可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm having issues with QByteArray
and QString
.
I'm reading a file and stores its information in a QByteArray
. The file is in unicode, so it contains something like: t\0 e\0 s\0 t\0 \0 \0
I'm trying to compare this value to my specified value, but it fails, because in the debugger I see it's not an unicode string.
The code will explain everything:
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.
In the debugger, it shows me that the variable Data
has the value "t\0 e\0 s\0 t\0 \0 \0"
and myValue
has the value "test"
. How can I fix it?
回答1:
You can use QTextCodec to convert the bytearray to a string:
QString DataAsString = QTextCodec::codecForMib(1015)->toUnicode(Data);
(1015 is UTF-16, 1014 UTF-16LE, 1013 UTF-16BE, 106 UTF-8)
From your example we can see that the string "test"
is encoded as "t\0 e\0 s\0 t\0 \0 \0"
in your encoding, i.e. every ascii character is followed by a \0
-byte, or resp. every ascii character is encoded as 2 bytes. The only unicode encoding in which ascii letters are encoded in this way, are UTF-16 or UCS-2 (which is a restricted version of UTF-16), so in your case the 1015 mib is needed (assuming your local endianess is the same as the input endianess).
回答2:
you can use QString::fromAscii()
QByteArray data = entity->getData(); QString s_data = QString::fromAscii(data.data());
with data()
returning a char*
for QT5, you should use fromCString()
instead, as fromAscii()
is deprecated, see https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872
回答3:
Use QString::fromUtf16((ushort *)Data.data())
, as shown in the following code example:
#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(); }
This is an alternative solution to the one using QTextCodec. The code has been tested using Qt 5.4.
回答4:
One may find QString::fromUtf8() also useful.
For QByteArray input
of "\010"
and "\000"
, QString::fromLocal8Bit(input, 1) returned "\010"
and ""
, but QString::fromUtf8(input, 1) correctly returned "\010"
and "\000"
.
回答5:
You can use:
QString::fromStdString(byteArray.toStdString())
回答6:
QString a = "test"; QByteArray a1 = a.toUtf8(); QString backToString = a1;
回答7:
You can use:
QString DataAsString = data.trimmed();
Data is a QByteArray.