QByteArray to QString

У меня проблемы с 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", Как я могу это исправить?

28

Решение

Ты можешь использовать 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-байт или соотв. каждый символ ascii кодируется как 2 байта. Единственная кодировка Unicode, в которой буквы ASCII кодируются таким образом, это UTF-16 или UCS-2 (это ограниченная версия UTF-16), поэтому в вашем случае требуется 1015 MIB (при условии, что ваша локальная последовательность является такой же как входной endianess).

23

Другие решения

ты можешь использовать 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

10

Ты можешь использовать:

QString::fromStdString(byteArray.toStdString())
3

Можно найти QString :: fromUtf8 () тоже полезно.

За QByteArray input из "\010" а также "\000",
QString :: fromLocal8Bit (input, 1) возвращенный "\010" а также "", но QString :: fromUtf8 (input, 1) правильно вернулся "\010" а также "\000",

2

использование 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.

2
QString a = "test";
QByteArray a1 = a.toUtf8();
QString backToString = a1;
-1

Ты можешь использовать:

QString DataAsString = data.trimmed();

Данные — это QByteArray.

-3
По вопросам рекламы [email protected]