Nik*_*ika 35 c++ qstring qt qbytearray qtcore
我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.
Run Code Online (Sandbox Code Playgroud)
在调试器中,它向我显示变量Data具有值"t\0 e\0 s\0 t\0 \0 \0"并myValue具有值"test".我该如何解决?
Ben*_*ela 26
您可以使用QTextCodec将bytearray转换为字符串:
QString DataAsString = QTextCodec::codecForMib(1015)->toUnicode(Data);
Run Code Online (Sandbox Code Playgroud)
(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相同).
小智 15
您可以使用:
QString::fromStdString(byteArray.toStdString())
Run Code Online (Sandbox Code Playgroud)
kir*_*off 14
您可以使用 QString::fromAscii()
QByteArray data = entity->getData();
QString s_data = QString::fromAscii(data.data());
Run Code Online (Sandbox Code Playgroud)
与data()返回char*
对于QT5,您应该使用fromCString(),fromAscii()不推荐使用,请参阅https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872
您可能会发现QString::fromUtf8()也很有用。
对于QByteArray input中"\010"和"\000",
QString::fromLocal8Bit(input, 1)返回"\010"和""
QString::fromUtf8(input, 1)正确返回"\010"和"\000"。
小智 8
您可以使用以下QString构造函数将QByteArray转换为QString:
QString(const QByteArray&ba)
QByteArray data;
QString DataAsString = QString(data);
Run Code Online (Sandbox Code Playgroud)
使用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();
}
Run Code Online (Sandbox Code Playgroud)
这是使用 QTextCodec 的替代解决方案。该代码已使用 Qt 5.4 进行了测试。