J'ai des problèmes avec QByteArray
et QString
.
Je lis un fichier et stocke ses informations dans une QByteArray
. Le fichier est en unicode, il contient donc quelque chose comme: t\0 e\0 s\0 t\0 \0 \0
J'essaie de comparer cette valeur à la valeur spécifiée, mais elle échoue car, dans le débogueur, je vois que ce n'est pas une chaîne unicode.
Le code expliquera tout:
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.
Dans le débogueur, cela me montre que la variable Data
a pour valeur "t\0 e\0 s\0 t\0 \0 \0"
et que myValue
a pour valeur "test"
. Comment puis-je le réparer?
Vous pouvez utiliser QTextCodec pour convertir le bytearray en chaîne:
QString DataAsString = QTextCodec::codecForMib(1015)->toUnicode(Data);
(1015 est UTF-16, 1014 UTF-16LE, 1013 UTF-16BE, 106 UTF-8)
Dans votre exemple, nous pouvons voir que la chaîne "test"
est codée sous la forme "t\0 e\0 s\0 t\0 \0 \0"
dans votre codage, c’est-à-dire que chaque caractère ascii est suivi d’un \0
-octet, ou resp. chaque caractère ascii est codé sur 2 octets. Les seuls codages Unicode dans lesquels les lettres ASCII sont codées de cette manière sont UTF-16 ou UCS-2 (qui est une version restreinte de UTF-16). Dans votre cas, le 1015 mib est donc nécessaire identique à l’endianess d’entrée).
vous pouvez utiliser QString::fromAscii()
QByteArray data = entity->getData();
QString s_data = QString::fromAscii(data.data());
avec data()
renvoyant un char*
pour QT5, vous devriez plutôt utiliser fromCString()
, car fromAscii()
est obsolète, voir https://bugreports.qt-project.org/browse/QTBUG-21872 https://bugreports.qt.io/browse/QTBUG-21872
Vous pouvez utiliser:
QString::fromStdString(byteArray.toStdString())
On peut trouver QString :: fromUtf8 () aussi utile.
Pour QByteArray input
de "\010"
et "\000"
, QString :: fromLocal8Bit (entrée, 1) a retourné "\010"
et ""
, mais QString :: fromUtf8 (entrée, 1) a renvoyé correctement "\010"
et "\000"
.
Utilisez QString::fromUtf16((ushort *)Data.data())
, comme indiqué dans l'exemple de code suivant:
#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();
}
C'est une solution alternative à celle utilisant QTextCodec. Le code a été testé avec Qt 5.4.
Vous pouvez utiliser ce constructeur QString pour la conversion de QByteArray en QString:
QString (const QByteArray & ba)
QByteArray data;
QString DataAsString = QString(data);