QByteArray to QString

匿名 (未验证) 提交于 2019-12-03 02:50:02

问题:

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.



文章来源: QByteArray to QString
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!