QByteArray à QString
Je vais avoir des problèmes avec QByteArray
et QString
.
Je suis en train de lire un fichier et le stocke ses informations dans un QByteArray
. Le fichier est au format unicode, donc il contient quelque chose comme: t\0 e\0 s\0 t\0 \0 \0
Je suis en train de comparer cette valeur à ma valeur spécifiée, mais elle ne réussit pas, parce que dans le débogueur, j'voir, c'est pas une chaîne unicode.
Le code va tout vous expliquer:
QByteArray Data; //contains unicode string "tQByteArray 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.
eQByteArray 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.
sQByteArray 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.
tQByteArray 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.
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.
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.
"
QString myValue = "test"; //value to compare.
if(Data.contains(myValue))
//do some stuff.
else
//do other stuff.
Dans le débogueur, il m'indique que la variable Data
a la valeur "t\0 e\0 s\0 t\0 \0 \0"
et myValue
a la valeur "test"
. Comment puis-je résoudre ce problème?
- Peut-être utile: qt-project.org/doc/qt-4.8/...
- Veuillez noter que le traitement des chaînes changé depuis Qt 5.0. Des tableaux de caractères en interne sont interprétées comme étant codé en UTF-8.
QString myValue = "äöü"
; par exemple, doit être évitée à moins que si le fichier source elle-même n'est pas stocké en UTF-8. Jetez un oeil à wiki.qt.io/Strings_and_encodings_in_Qt pour plus d'informations.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser QTextCodec pour convertir l'objet bytearray à une chaîne:
(1015 UTF-16, 1014 UTF-16LE, 1013 UTF-16BE, 106 UTF-8)
À partir de votre exemple, nous pouvons voir que la chaîne
"test"
est codé comme"t\0 e\0 s\0 t\0 \0 \0"
dans votre codage, c'est à dire chaque caractère ascii est suivie par un\0
-octets, ou resp. chaque caractère ascii est codé sous forme de 2 octets. Le seul codage unicode dans lequel les lettres ascii sont codés de cette manière, UTF-16 ou UCS-2 (qui est une version restreinte de l'UTF-16), donc dans votre cas, le 1015 mib est nécessaire (en supposant que votre local endianess est le même que l'entrée endianess).QString::fromUTf16
? Qui prend un ushort pointeur, ce qui serait d'une très laid casting pour passer unQByteArray
t\0e\0s\0t\0
àtest
. Si elle était en utf-8, il n'y aurait pas\0
-octetsvous pouvez utiliser
QString::fromAscii()
avec
data()
retour d'unchar*
pour QT5, vous devez utiliser
fromCString()
au lieu de cela, commefromAscii()
est obsolète, voirhttps://bugreports.qt-project.org/browse/QTBUG-21872https://bugreports.qt.io/browse/QTBUG-21872fromCString()
, vouliez-vous dire (ou était la méthode la renommée depuis la Q / A)fromCFString()
?Vous pouvez utiliser:
Vous pouvez utiliser cette QString constructeur pour la conversion de QByteArray de QString:
QString(const QByteArray &ba)
On peut trouver des QString::fromUtf8() également utile.
Pour
QByteArray input
de"\010"
et"\000"
,QString::fromLocal8Bit(entrée, 1) retourné
"\010"
et""
, mais QString::fromUtf8(entrée, 1) retournés correctement"\010"
et"\000"
.Utilisation
QString::fromUtf16((ushort *)Data.data())
, comme illustré dans l'exemple de code suivant:C'est une solution alternative à la une à l'aide de QTextCodec. Le code a été testé à l'aide de Qt 5.4.
Vous pouvez utiliser:
De données est un QByteArray.