2010-04-29 12 views
12

Estoy luchando para comenzar con la biblioteca de ICU de C++. He intentado que funcione el ejemplo más simple, pero incluso eso ha fallado. Me gustaría dar salida a una cadena UTF-8 y luego ir desde allí.C++ UTF-8 de salida con ICU

Aquí es lo que tengo:

#include <unicode/unistr.h> 
#include <unicode/ustream.h> 

#include <iostream> 

int main() 
{ 
    UnicodeString s = UNICODE_STRING_SIMPLE("привет"); 

    std::cout << s << std::endl; 

    return 0; 
} 

Aquí está la salida:

$ g++ -I/sw/include -licucore -Wall -Werror -o icu_test main.cpp 
$ ./icu_test 
пÑÐ¸Ð²ÐµÑ 

Mi soporte del terminal y la fuente UTF-8 y uso regularmente el terminal con UTF-8. Mi código fuente está en UTF-8.

Creo que de alguna manera necesito configurar el flujo de salida a UTF-8 porque la ICU almacena cadenas como UTF-16, pero realmente no estoy seguro y hubiera pensado que los operadores proporcionados por ustream.h haz eso de todos modos.

Cualquier ayuda sería apreciada, gracias.

+1

¿Ha intentado utilizar std :: wcout? – Milan

+1

Sí, pero la ICU no parece proporcionar un operador << por eso, así que acabo de obtener una larga lista de errores de g ++. – Isaac

+0

¿Has presentado un error en wcout? (¿por favor? :) (con justificación?) –

Respuesta

12

Su programa funcionará si sólo cambia el inicializador para:

UnicodeString s("привет"); 

La macro que estaba usando es only for strings that contain "invariant characters", i.e., only latin letters, digits, and some punctuation.

Como se dijo anteriormente, las páginas de códigos de entrada/salida son complicadas. Usted dijo:

Mi terminal y soporte de fuentes UTF-8 y Regularmente uso del terminal con UTF-8. Mi código fuente está en UTF-8.

Eso puede ser cierto, pero la UCI no sabe que es verdad. La página de códigos del proceso puede ser diferente (digamos iso-8859-1), y la página de códigos de salida puede ser diferente (digamos shift-jis). Entonces, el programa no funcionaría. Pero, los caracteres invariantes que usan la API UNICODE_STRING_SIMPLE seguirían funcionando.

Espero que esto ayude.

srl, dev UCI

+0

¡Gracias! Eso sí que funciona Desde que firmó con 'icu dev', tal vez lo sabrá: ¿conoce algún canal de IRC para la ayuda de la ICU? Busqué, pero no pude encontrar ninguno. – Isaac

+0

No conozco ningún canal de IRC, ¿somos tan populares? A veces miro aquí (y de vez en cuando hago otras búsquedas web) pero nuestra lista de correo de icu-support y la base de datos de errores en http://icu-project.org son los canales principales. Esa es una idea interesante Podrías proponerlo allí. Soy el líder técnico de ICU para C/C++. –

+0

Bueno, he estado buscando bastante en los últimos días, buscando una solución Unicode y la ICU es considerada la "mejor" para C++ de todas las fuentes que he leído. Todas las mismas fuentes también se quejan de que falta documentación y hay muchas otras publicaciones en el foro que dicen lo mismo. Dado que ni siquiera podía hacer funcionar un programa de estilo 'Hola mundo', estaría de acuerdo con esto, lo siento. Sé que no es tu culpa, pero si tienes alguna influencia, por favor haz algunas sugerencias para mejorar los documentos. – Isaac

2

¿Qué pasa si se escribe el resultado en un archivo (o bien redirigir el uso de tuberías de la terminal, o abriendo una secuencia de archivo en el propio programa)

que determinaría si es o no es el terminal que falla manejar la salida correctamente

¿Qué sucede si inspecciona la cadena de salida en el depurador? ¿Contiene los valores correctos? Averigüe cómo se ve la codificación UTF-8 de su cadena y, y compárela con lo que obtiene en el depurador. O imprima el valor integral de cada byte y verifique que sean correctos.

Al trabajar con codificación siempre es difícil (pero esencial) determinar si el problema reside en su propio programa o en la conversión que ocurre cuando el texto se envía al sistema. Saque la terminal de la ecuación y verifique que su programa genera la salida correcta.

+0

Escribir en un archivo es un paso muy bueno para depurar codificaciones. –

+0

Acabo de escribir en el archivo y obtengo el mismo resultado. Echaré un vistazo al depurador ahora mismo. – Isaac

1

operator<<(ostream, UnicodeString) convierte entre UTF16 y caracteres mediante el uso de "convertidor predeterminado" de la UCI.AFAIU, el "convertidor predeterminado" (si no lo configura explícitamente con ucnv_setDefaultName()) depende de la plataforma y de la forma en que se compiló la ICU. ¿Qué obtienes de ucnv_getDefaultName()?

+1

FWIW la herramienta independiente 'icuinfo' informa la página de códigos predeterminada a partir de 4.4. El convertidor predeterminado puede provenir de muchos lugares salvajes y maravillosos. –

+0

Mi problema ha sido resuelto, pero para responder a su pregunta, obtengo 'en_GB'. – Isaac

+1

icuinfo debe devolver algo como: Configuración regional predeterminada: en_ES ... Convertidor predeterminado: UTF-8 –