2010-06-30 22 views
8

J'utilise la bibliothèque ICU en C++ sur OS X. Toutes mes chaînes sont UnicodeStrings, mais j'ai besoin d'utiliser des appels système comme fopen, fread et ainsi de suite. Ces fonctions prennent const char * ou char * comme arguments. J'ai lu que OS X supporte UTF-8 en interne, de sorte que tout ce que j'ai à faire est de convertir mon UnicodeString en UTF-8, mais je ne sais pas comment faire. UnicodeString a une fonction membre toUTF8(), mais renvoie un ByteSink. J'ai également trouvé ces exemples: http://source.icu-project.org/repos/icu/icu/trunk/source/samples/ucnv/convsamp.cpp et lire à propos de l'utilisation d'un convertisseur, mais je suis toujours confus. Toute aide serait très appréciée.UnicodeString à char * (UTF-8)

Répondre

7

appel UnicodeString::extract(...) pour extraire dans un char *, passez NULL pour le convertisseur pour obtenir le convertisseur par défaut (qui est dans le charset que votre système d'exploitation utilisera).

+1

Merci beaucoup! Cela fonctionne. Je ne suis pas sûr de l'argument destCapacity et de la longueur de UnicodeString. Ce code fonctionne: http://codepad.org/blaSP0ex mais vous remarquerez que je doubler le .length() de l'UnicodeString manuellement pour compenser la chaîne multi-octets. Comment puis-je m'assurer qu'il y a suffisamment d'espace dans mon personnage? – zfedsa

+0

http://icu-project.org/apiref/icu4c/classUnicodeString.html#125255f27efd817e38806d76d9567345 Il retournera la longueur nécessaire pour la chaîne de sortie et un statut U_BUFFER_OVERFLOW_ERROR s'il n'y avait pas assez d'espace. Voir http://userguide.icu-project.org/strings#TOC-Using-C-Strings:-NUL-Terminated-vs%2e –

+0

Merci. La documentation indique qu'il est préférable de deviner la taille et s'il y a une erreur de débordement de tampon, puis d'appeler à nouveau la fonction d'extraction avec la longueur renvoyée par le premier appel. Je le fais ici: http://codepad.org/nyp5yJWB mais le second appel échoue toujours, même si je lui donne la bonne longueur renvoyée par le premier appel d'extraction. Qu'est-ce que je fais mal? – zfedsa

3

Cela fonctionne:

std::string utf8; 
uStr.toUTF8String(utf8); 
4

ICU User Guide > UTF-8 fournit des méthodes et des descriptions de faire.

La façon la plus simple d'utiliser des chaînes de caractères UTF-8 dans les API UTF-16 se fait par l'icu::UnicodeString C++ méthodes fromUTF8(const StringPiece &utf8) et toUTF8String(StringClass &result). Il y a également toUTF8(ByteSink &sink).

Et extract() n'est pas maintenant préférions.

Note: icu::UnicodeString a des constructeurs, setTo() et extract() méthodes qui prennent soit un objet convertisseur ou un nom charset. Ceux-ci peuvent être utilisés pour UTF-8, mais ne sont pas aussi efficaces ou pratiques que les méthodes fromUTF8()/toUTF8()/toUTF8String() mentionnées ci-dessus.