¿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.
Relacionados con http://stackoverflow.com/questions/3613149/3614105#3614105 – dan04