我遇到QByteArray
和QString
的问题。
我正在阅读文件并将其信息存储在QByteArray
中。该文件是unicode,因此它包含: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"
。我该如何解决?
答案 0 :(得分:24)
您可以使用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
字节或resp。每个ascii字符编码为2个字节。 ascii字母以这种方式编码的唯一unicode编码是UTF-16或UCS-2(UTF-16的限制版本),所以在你的情况下需要1015 mib(假设你的本地字节是与输入endianess相同。)
答案 1 :(得分:12)
您可以使用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
答案 2 :(得分:6)
您可以使用:
QString::fromStdString(byteArray.toStdString())
答案 3 :(得分:5)
您可以使用以下QString构造函数将QByteArray转换为QString:
QString(const QByteArray&ba)
QByteArray data;
QString DataAsString = QString(data);
答案 4 :(得分:4)
有人可能会发现QString::fromUtf8()也很有用。
QByteArray input
"\010"
和"\000"
的{{1}},
QString::fromLocal8Bit(input, 1)已返回"\010"
和""
,但QString::fromUtf8(input, 1)已正确返回"\010"
和"\000"
。
答案 5 :(得分:3)
使用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进行测试。
答案 6 :(得分:0)
Qt 4.8
QString(byteArray).toStdString();
Qt 5.12
byteArray.toStdString();
答案 7 :(得分:-1)
QString a = "test";
QByteArray a1 = a.toUtf8();
QString backToString = a1;
答案 8 :(得分:-3)
您可以使用:
QString DataAsString = data.trimmed();
数据是QByteArray。