J'ai une application censée faire face à toutes sortes de caractères et à des informations d'affichage à quelques points à leur sujet. J'utilise QT et son support Unicode inhérent à Qchar, Qstring, etc. P>
Maintenant, j'ai besoin du point de code d'un QCHAR afin de rechercher des données dans http: / /unicode.org/public/unidata/unicodeData.txt , mais la méthode Unicode () de QCHAR () ne renvoie qu'une UShort (non signé court), qui est généralement un nombre compris entre 0 et 65535 (ou 0xFFFF). Il y a des personnages avec des points de code> 0xFFFF, alors comment puis-je obtenir ces? Y a-t-il quelques astuces que je manque ou est-ce actuellement non pris en charge par QT / QCHAR? P>
3 Réponses :
Chaque QCHAR code> est une valeur UTF-16, et non un point de code unicode complet. Par conséquent, les caractères non-BMP consistent en deux qchars code> paires de substitution. P>
J'ai ouvert Qtbug-18868 À propos de ce problème en 2011, mais après plus de trois ans (!) de discussion, c'était Finalement fermé comme "hors de portée" sans aucune résolution. p> Vous pouvez, cependant, télécharger et utiliser Ces classes d'emballage de chaîne QT Unicode qui ont été jointes au rapport de bogue QT. Sous licence sous la LGPL. P> Ce téléchargement contient les classes de wrapper Pour plus de détails sur la complexité de mise en œuvre, d'utilisation et d'exécution Veuillez consulter la documentation de l'API incluse dans le téléchargement. p> h2> QCHAR code> prend uniquement en charge les caractères Unicode jusqu'à u + ffff code>. p> Qstring code> prend en charge les caractères Unicode au-delà u + ffff code> par concaténant deux qchars strong> (c'est-à-dire à l'aide de l'encodage UTF-16). Cependant, l'API Qstring ne vous aide pas beaucoup si vous devez traiter des caractères au-delà u + ffff code>. Par exemple, une instance qstring qui contient le caractère unicode unique u + 131f6 code> retournera une taille de 2, pas 1. P> solution h2>
qutfstring code>, qutfchar code>, qutfregexp code> et qutfstringlist < / Code> qui complètent les classes QT existantes et vous permettent de faire des choses comme ceci: p>
La solution semble insérée dans le code documenté mais non vu beaucoup sur le Web. Vous pouvez obtenir la valeur UTF-8 sous forme décimale. Vous postulez ensuite pour déterminer si un seul QChar est assez grand. Dans ce cas, ce n'est pas le cas. Ensuite, vous devez créer deux QCHAR.
uint32_t cp = 155222; // a 4-byte Japanese character
QString str;
if(Qchar::requiresSurrogate(cp))
{
QChar charArray[2];
charArray[0] = QChar::highSurrogate(cp);
charArray[1] = QChar::lowSurrogate(cp);
str = QString(charArray, 2);
}
BTW, QQstring Docs Commencez par "La classe QString fournit une chaîne de caractères Unicode. String stocke une chaîne de QCHAR 16 bits, où chaque QCHAR correspond à un caractère Unicode 4.0. (Les caractères Unicode avec des valeurs de code ci-dessus sont stockés à l'aide de paires de substitution, c'est-à-dire , deux qchars consécutifs.) "