2010-06-30 4 views
8

Estoy usando la biblioteca de ICU en C++ en OS X. Todas mis cadenas son UnicodeStrings, pero necesito usar llamadas al sistema como fopen, fread, etc. Estas funciones toman const char * o char * como argumentos. He leído que OS X es compatible con UTF-8 internamente, por lo que todo lo que tengo que hacer es convertir Mi UnicodeString a UTF-8, pero no sé cómo hacerlo.UnicodeString a char * (UTF-8)

UnicodeString tiene una función de miembro toUTF8(), pero devuelve un ByteSink. También encontré estos ejemplos: http://source.icu-project.org/repos/icu/icu/trunk/source/samples/ucnv/convsamp.cpp y leí sobre el uso de un convertidor, pero todavía estoy confundido. Cualquier ayuda sería muy apreciada.

Respuesta

7

llamada UnicodeString::extract(...) para extraer en un char *, pase NULL para que el convertidor obtenga el convertidor predeterminado (que está en el juego de caracteres que usará su sistema operativo).

+1

¡Gracias! Eso funciona No estoy seguro sobre el argumento destCapacity y la longitud de UnicodeString. Este código funciona: http://codepad.org/blaSP0ex pero notarás que duplico el .length() de UnicodeString manualmente para compensar la cadena multibyte. ¿Cómo puedo asegurarme de que haya suficiente espacio en mi char * dest? – zfedsa

+0

http://icu-project.org/apiref/icu4c/classUnicodeString.html#125255f27efd817e38806d76d9567345 Devolverá la longitud necesaria para la cadena de salida y un U_BUFFER_OVERFLOW_ERROR en estado si no hubiera suficiente espacio. Ver http://userguide.icu-project.org/strings#TOC-Using-C-Strings:-NUL-Terminated-vs%2e –

+0

Gracias. La documentación dice que es mejor adivinar el tamaño y si hay un error de desbordamiento del búfer, luego llamar de nuevo a la función extraer con la longitud devuelta desde la primera llamada. Lo hago aquí: http://codepad.org/nyp5yJWB pero la segunda llamada aún falla, aunque le proporciono la longitud correcta devuelta desde la primera llamada de extracción. ¿Qué estoy haciendo mal? – zfedsa

3

Esto funcionará:

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

ICU User Guide > UTF-8 proporciona métodos y descripciones de hacerlo.

La forma más sencilla de utilizar UTF-8 cadenas en UTF-16 APIs es a través de los métodos C++ icu::UnicodeStringfromUTF8(const StringPiece &utf8) y toUTF8String(StringClass &result). También hay toUTF8(ByteSink &sink).

Y extract() no se prefiere ahora.

Nota: icu::UnicodeString tiene constructores, setTo() y extract() métodos que tienen ya sea un objeto convertidor o un nombre de conjunto de caracteres. Estos pueden usarse para UTF-8, pero no son tan eficientes ni convenientes como los métodos fromUTF8()/toUTF8()/toUTF8String() mencionados anteriormente.