7
votes

Récupérer des points de code Unicode> U + FFFF de QCHAR

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.

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?


1 commentaires

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.) "


3 Réponses :


7
votes

Chaque QCHAR 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 paires de substitution.


0 commentaires

2
votes

Les caractères unicode au-delà de U + FFFF dans qt

QCHAR prend uniquement en charge les caractères Unicode jusqu'à u + ffff .

Qstring prend en charge les caractères Unicode au-delà u + ffff par concaténant deux qchars (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 . Par exemple, une instance qstring qui contient le caractère unicode unique u + 131f6 retournera une taille de 2, pas 1.

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.

solution

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.

Ce téléchargement contient les classes de wrapper qutfstring , qutfchar , qutfregexp et qutfstringlist < / Code> qui complètent les classes QT existantes et vous permettent de faire des choses comme ceci: xxx

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.


0 commentaires

3
votes

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);
}


0 commentaires