2009-06-05 4 views
4

Je suis en train de trouver la conversion UTF-32 texte/de toute page de code est possible en utilisant l'API Windows seul. Je ne peux pas utiliser CLR pour faire cette tâche.Est-il possible de convertir du texte UTF32 en UTF16 en utilisant uniquement l'API Windows?

La page des identificateurs de page de codes chez Microsoft au http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx répertorie UTF-32 comme n'étant disponible que pour les applicatiosn gérées.

ConvertStringTo/fromUnicode échoue lorsque UTF-32 est utilisé.

Répondre

1

Avec un peu de connaissance de l'Unicode, vous devriez être en mesure de créer un UTF32 convertisseur UTF16 sans utiliser des API.

Tous les caractères dans la plage U + 0000 à U + FFFF peut simplement avoir les 16 bits supérieurs retirés.

Les valeurs dans la gamme U + 10000 à U + 10FFFF peuvent être convertis en deux mots de 16 bits, appelé paires de substitution:

http://en.wikipedia.org/wiki/UTF-16#Encoding_of_characters_outside_the_BMP

+0

la réponse est que vous ne pouvez pas utiliser l'API Window pour cela. Vous devez le faire vous-même. Voici un lien vers un code testé pour cela, à partir unicode: http://www.unicode.org/Public/PROGRAMS/CVTUTF/ –

+0

Ils ont maintenant renvoyé cette à [ICU] (http://site.icu -project.org/) dans leur FAQ. –

0

Vous pouvez utiliser la bibliothèque iconv dans Windows. Il supporte complètement UTF-32 (grand et petit boutiste).

+0

Je ne veux utiliser aucune bibliothèque externe pour cela. Une bibliothèque alternative est libicu –

+0

Vous devrez écrire votre propre code pour convertir entre UTF-16 et UTF-32. Ce n'est pas difficile à faire manuellement. –

0

Vous pouvez utiliser cette fonction qui convertit le codepoint UTF-32 en son codet UTF-16 équivalent (simple ou substitut selon le cas) comme premier argument et les substituts haute et basse comme deuxième et troisième arguments. Les valeurs de substitution haute et basse sont renvoyées par référence.

Si le point de code est inférieur à 0x10000, nous revenons simplement que codepoint dans le bas de substitution par référence alors que la mère porteuse est élevée 0.

Si le point de code est supérieur à 0x10000, alors, nous calculons le haut et bas les paires de substitution en utilisant les règles données sur cette page wikipedia:

https://en.wikipedia.org/wiki/UTF-16#Example_UTF-16_encoding_procedure

Voici le code:

unsigned int convertUTF32ToUTF16(unsigned int cUTF32, unsigned int &h, unsigned int &l) 
{ 
    if (cUTF32 < 0x10000) 
    { 
     h = 0; 
     l = cUTF32; 
     return cUTF32; 
    } 
    unsigned int t = cUTF32 - 0x10000; 
    h = (((t<<12)>>22) + 0xD800); 
    l = (((t<<22)>>22) + 0xDC00); 
    unsigned int ret = ((h<<16) | (l & 0x0000FFFF)); 
    return ret; 
} 
Questions connexes