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
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).
Cela fonctionne:
std::string utf8;
uStr.toUTF8String(utf8);
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éthodesfromUTF8(const StringPiece &utf8)
ettoUTF8String(StringClass &result)
. Il y a égalementtoUTF8(ByteSink &sink)
.
Et extract()
n'est pas maintenant préférions.
Note:
icu::UnicodeString
a des constructeurs,setTo()
etextract()
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éthodesfromUTF8()
/toUTF8()
/toUTF8String()
mentionnées ci-dessus.
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
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 –
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