Que fait QString :: toUtf8?
Cela peut sonne comme une question évidente, mais il me manque quelque chose sur la façon dont l'UTF-8 est codée ou comment le toUtf8 fonctionne.
Regardons un programme très simple
QString str("Müller");
qDebug() << str << str.toUtf8().toHex();
Puis-je obtenir la sortie
"Müller" "4dc383c2bc6c6c6572"
Mais j'ai eu l'idée de le la lettre ü devrait ont été codés comme c3bc et pas c383c2bc.
Merci
Johan
source d'informationauteur Johan | 2011-01-31
Vous devez vous connecter pour publier un commentaire.
Il dépend de l'encodage de votre code source.
J'ai tendance à penser que votre fichier est déjà encodé en UTF-8, le caractère ü être codés de la C3 en colombie-britannique.
Vous appelez le
QString::QString ( const char * str )
constructeur qui, selon http://doc.qt.io/qt-4.8/qstring.html#QString-8convertit votre chaîne de caractères unicode à l'aide de la QString::fromAscii() méthode qui, par défaut, estime l'entrée comme Latin1 contenu.Que C3 et BC sont tous les deux valides en Latin 1, représentant respectivement à et¼, les convertir en UTF-8 entraînera les caractères suivants:
à (C3) -> C3 83
¼ (Colombie-britannique) -> C2 BC
qui mène à la chaîne, vous bénéficiez de: "4d c3 83 c2 bc 6c 6c 65 72"
Pour résumer les choses, c'est de double encodage UTF-8.
Il y a plusieurs options pour résoudre ce problème:
1) Vous pouvez convertir votre fichier source pour le Latin-1 à l'aide de votre éditeur de texte favori.
2) Vous pouvez échapper correctement le ü caractère en \xFC dans le littérale de la chaîne, la chaîne ne dépendra pas de l'encodage du fichier.
3) vous pouvez garder le fichier et chaîne en UTF-8 des données et l'utilisation
QString str = QString::fromUtf8 ("Müller");
Mise à jour: Cette question n'est plus pertinente dans QT5. http://doc.qt.io/qt-5/qstring.html#QString-8 états que le constructeur utilise maintenant
QString::fromUtf8()
en interne au lieu deQString::fromAscii()
. Donc, tant que l'encodage UTF-8 est utilisé régulièrement, il sera utilisé par défaut.L'exécution de votre code j'obtiens le résultat escompté
"4dc3bc6c6c6572"
Je pense que le problème est avec votre entrée pas de sortie.
Vérifier l'encodage de votre fichier source et de regarder
void QTextCodec::setCodecForCStrings ( QTextCodec * codec ) [statique]