2010-09-02 44 views
11

¿Cuáles son las formas más portátiles y limpias de manejar las secuencias de caracteres Unicode en C y C++?¿Cómo manejar las secuencias de caracteres Unicode en C/C++?

Por otra parte, la forma de:

cadenas Unicode -Leer

cadenas Unicode -convert a ASCII para salvar algunos bytes (si el usuario sólo introduce ASCII)

cadenas Unicode -Imprimir

¿Debo usar el medio ambiente también? He leído sobre LC_CTYPE, por ejemplo, ¿debería importarme como desarrollador?

+0

Relacionados con http://stackoverflow.com/questions/3613149/3614105#3614105 – dan04

Respuesta

0

¿Necesita leer, imprimir o convertir Unicode a ASCII si corresponde? Simplemente use UTF-8 y todo esto sería absolutamente transparente para usted.

  • lectura, escritura ninguna diferencia
  • ASCII ya está subconjunto de UTF-8

Para el análisis de texto/manejo de uso de buenas bibliotecas como UCI, Boost.Locale o incluso Qt, que dan bastante Glib buenas herramientas de análisis/manejo de texto.

3

¿Cuáles son las formas más portátiles y limpias de manejar las secuencias de caracteres Unicode en C y C++?

Utilice una biblioteca como ICU. Si no puedes, eso es abso-maldito-lutely no puede hacer tu propio. Esté preparado para tener Hard Time sin embargo. Además, busque Unicode.or g documentación sobre el código fuente de la muestra.

¿Debo usar el entorno también?

Sí. Probablemente necesites usar la función std::setlocale también. Esto le permitiría establecer una configuración regional correspondiente a la codificación que desea, p. si desea utilizar inglés británico como idioma y UTF-8 como codificación, tendrá set LC_CTYPE to en_GB.UTF8.

C++ 03 no le ofrece una forma de manejar Unicode. Su mejor opción es utilizar el tipo de datos wchar_t (y por extensión std::wstring). Sin embargo, tenga en cuenta que el tamaño y la codificación de caracteres es diferente en diferentes sistemas operativos. P.ej. Windows usa 2 bytes para wchar_t y codificación UTF-16, mientras que GNU/Linux y Mac OSX usan 4 bytes y UTF-32.

Se supone que C++ 0x debe modificar la situación al permitir literales Unicode codecvt facetas, C Unicode TR compatible (leer <uchar.h>) etc. pero eso es un largo camino para la mayoría de los compiladores. (Hay algunas preguntas aquí en la SO que debería ayudarle a empezar.)

+1

-1 std :: wstring! = ** La cadena ** Unicode; std :: string es perfectamente una cadena Unicode como std :: wstring! – Artyom

+1

No dije 'std :: wstring' es Unicode. – dirkgently

+0

Mi punto es este: 'std :: wstring' puede ser útil para UTF16 (en Windows) y UTF32 (en Mac/Linux). El mayor problema con UTF8 es que es una codificación de ancho variable y, por lo tanto, un 'char' o un' wchar_t' * may * no pueden representar un carácter Unicode en todas las plataformas. – dirkgently

8

¿Cuáles son los portátiles y limpias maneras más para manejar caracteres Unicode secuencias en C y C++?

Haga que todas las cadenas en su programa sean UTF-8, UTF-16, or UTF-32.Si por algún motivo necesita trabajar con una codificación que no sea Unicode, realice la conversión a la entrada y a la salida.

cadenas Unicode Leer

misma forma en que lee un archivo ASCII. Pero todavía hay una gran cantidad de datos que no son Unicode, por lo que querrá verificar si los datos son Unicode. Si no es así (o si es UTF-8 cuando su codificación interna preferida es UTF-32), tendrá que convertirla.

  • UTF-8 y UTF-32 se pueden detectar de manera confiable por validación.
  • UTF-16 se puede detectar con la presencia de una BOM.
  • Si no es una codificación UTF, es probable en ISO-8859-1 o Windows-1252.

cadenas Unicode Convertir a ASCII a guardar algunos bytes (si el usuario sólo entradas ASCII)

no hacer

. Si sus datos son todos ASCII, entonces UTF-8 tomará exactamente la misma cantidad de espacio. Y si no lo es, perderás información cuando conviertas a ASCII. Si te importa guardar bytes

  • Elija la codificación UTF óptima. Para los caracteres U + 0000 a U + 007F, UTF-8 es el más pequeño. Para los caracteres U + 0800 a U + FFFF, UTF-16 es el más pequeño.
  • Usa compresión de datos como gzip. Hay una codificación SCSU específicamente diseñada para Unicode, pero no sé qué tan buena es.

cadenas de impresión Unicode

La escritura UTF-8 no es diferente de la escritura ASCII.

Excepto en el símbolo del sistema de Windows, porque todavía utiliza las páginas de códigos "OEM" antiguas. Allí puede usar WriteConsoleW con cadenas UTF-16.

¿Debo usar el entorno también? He leído acerca de LC_CTYPE por ejemplo, si me importa como desarrollador ?

LC_CTYPE es un vestigio de los días en que cada lengua tiene su propia codificación de caracteres, y por lo tanto sus propias funciones ctype.h. Hoy, el Unicode Character Database se ocupa de eso. La belleza de Unicode es que separa el manejo de codificación de caracteres del manejo del entorno local (excepto para el special uppercase/lowercase rules para lituano, turco y azerí).

Pero cada idioma todavía tiene sus propias reglas de intercalación y reglas de formato de número, por lo que aún necesitará configuraciones regionales para las mismas. Y deberá configurar la codificación de caracteres de su configuración regional en UTF-8.

+1

descripción excelente, en particular porque evita cualquier cosa específica del lenguaje de programación –

0

Aquí hay buenas respuestas escritas antes de esta, pero ninguna de ellas menciona una cosa en particular que veo como un problema probable, ya que esta pregunta también tiene la etiqueta C. Mi conocimiento de C está desactualizado, así que por favor corrígeme si me equivoco.

Tenga en cuenta que probablemente las cadenas terminadas en cero, las funciones tradicionales de cadena C y el flujo de datos codificado UTF-16 son una combinación difícil, porque en UTF-16 muchos caracteres alfanuméricos occidentales se codificarán en dos bytes que tienen el otro byte todos los ceros y, por lo tanto, leer los datos de caracteres como series de char s no es lo que solía ser con conjuntos de caracteres de un solo byte.

+0

Puede usar cadenas terminadas en 0x0000 con UTF-16. La UCI (mencionada anteriormente) apoya esto bastante extensamente. No puede suponer que UTF-16 cabe en un char de 8 bits, como ha notado. –

Cuestiones relacionadas