2010-04-21 5 views
3

J'ai une chaîne de caractère large est L "hao123-- 我 的 上网 主页", et il doit être codé à "hao123 - \ u6211 \ u7684 \ u4E0A \ u7F51 \ u4E3B \ u9875" . On m'a dit que la chaîne codée est un format spécial "% uNNNN" pour coder les points de code Unicode UTF-16. En this website, il me dit que c'est des échappements de JavaScript. Mais je ne sais pas comment l'encoder en C++.C++ codage Unicode UTF-16

Y at-il une bibliothèque pour que cela fonctionne? ou donne moi quelques conseils.

Merci mes amis!

Répondre

2

L'incorporation d'unicode dans des chaînes littérales n'est généralement pas une bonne idée et n'est pas portable; il n'y a aucune garantie que wchar_t sera 16 bits et que l'encodage sera UTF-16. Bien que cela puisse être le cas sur Windows avec Microsoft Visual C++ (une implémentation C++ particulière), wchar_t est de 32 bits sur GCC d'OS X (une autre implémentation). Si vous avez des constantes de chaîne localisées, il est préférable d'utiliser un fichier de configuration dans un encodage particulier et de les interpréter comme ayant été codées dans cet encodage. La bibliothèque International Components for Unicode (ICU) fournit un très bon support pour interpréter et gérer unicode. Une autre bonne bibliothèque pour convertir (mais pas interpréter) les formats de codage est libiconv.

Modifier
Il est possible que je suis mal interprété votre question ... si le problème est que vous avez une chaîne en UTF-16 déjà, et que vous voulez convertir en « ASCII unicode-évasion » (c.-à- une chaîne ASCII où les caractères unicode sont représentés par « \ u » suivi de la valeur numérique du caractère), puis utilisez le pseudo-code suivant:

 
for each codepoint represented by the UTF-16 encoded string: 
    if the codepoint is in the range [0,0x7F]: 
     emit the codepoint casted to a char 
    else: 
     emit "\u" followed by the hexadecimal digits representing codepoint 

maintenant, pour obtenir le point de code, il est très simple règle ... chaque élément de la chaîne UTF-16 est un point de code, à moins qu'il ne fasse partie d'une "paire de substitution", auquel cas elle et l'élément qui la suit constituent un seul point de code. Si tel est le cas, la norme Unicode définit une procédure pour combiner le «substitut principal» et le «substitut final» en un seul point de code. Notez que UTF-8 et UTF-16 sont tous les deux des encodages de longueur variable ... un point de code requiert 32 bits s'il n'est pas représenté avec une longueur variable. Le Unicode Transformation Format (UTF) FAQ explique l'encodage ainsi que comment identifier les paires de substitution et comment les combiner en points de code.

+0

Mais c'est l'exigence, je n'ai pas le choix, l'application ne fonctionnera que dans Windows. Quelqu'un peut-il me donner un exemple pour le convertir. Par ailleurs, le site de l'unité de soins intensifs n'est pas accessible ici. Merci – Dan

+0

@Dan, si vous utilisez le L "hao123 - \ x6211 \ x7684 \ x4E0A \ x7F51 \ x4E3B \ x9875" sur Windows, alors il devrait être une chaîne const wchar_t *, et il devrait être codé en UTF-16 ... vous devrez cependant déterminer si c'est UTF-16LE ou UTF-16BE (c'est-à-dire si c'est little-endian ou big-endian). Je soupçonne que ce sera petit-boutiste, mais vous devrez l'essayer. Je n'utilise pas Windows (je suis un type * NIX, et je ne suis pas trop friand de Microsoft pour sa non-conformité intentionnelle à la norme IEEE 1003.1 ainsi que son non-respect intentionnel de l'ISO C99 et d'autres normes), vous devrez donc l'essayer sur votre système ... –

+0

@Dan, ... si vous convertissez le const wchar_t * en un const char *, puis imprimez chaque octet, individuellement, en tant que nombre hexadécimal, que faites-vous obtenir? Si vous partagez cela, il devrait être plus facile de répondre à votre question. –

0

Il suffit d'utiliser \x au lieu de \u.

+0

I Il suffit de le stocker dans une chaîne, si x, et je peux bien sûr le changer en u. Mais comment puis-je le convertir? Merci – Dan