2008-10-05 9 views
32

He logrado ignorar todo este material de múltiples bytes, pero ahora necesito hacer un trabajo de interfaz de usuario y sé que mi ignorancia en esta área me va a alcanzar. ¿Alguien puede explicar en unos pocos párrafos o menos lo que necesito saber para poder localizar mis aplicaciones? Qué tipos debo usar (uso tanto .Net como C/C++, y necesito esta respuesta para Unix y Windows).UTF8 vs. UTF16 vs. char * ¿contra qué? ¡Alguien me explique este lío!

Respuesta

76

Salida de Joel Spolsky The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

EDITAR 20140523: También, ver Characters, Symbols and the Unicode Miracle por Tom Scott en YouTube - es un poco menos de diez minutos, y una maravillosa explicación de la brillante 'hackear' que es UTF-8

+1

Hehe, cuando leí el título, este fue exactamente el artículo que se me vino a la mente. – VVS

+0

No había leído eso antes ... recibí mi entrenamiento i18n a través de otras vías. Gracias por el enlace – Akrikos

+2

+1 para un artículo enorme y enormemente educativo. –

25

Una codificación de caracteres consiste en una secuencia de códigos que cada uno busca un símbolo de un juego de caracteres dado. Por favor, consulte este buen artículo en Wikipedia on character encoding.

UTF8 (UCS) utiliza de 1 a 4 bytes para cada símbolo. Wikipedia da un buen resumen de cómo funciona el resumen de varios bytes:

  • El bit más significativo de un carácter de un solo byte es siempre 0.
  • Los bits más significativos del primer byte de un multi -byte sequence determina la longitud de la secuencia. Estos bits más significativos son 110 para secuencias de dos bytes; 1110 para secuencias de tres bytes, y así sucesivamente.
  • Los bytes restantes en una secuencia de varios bytes tienen 10 como sus dos bits más significativos .
  • Una secuencia UTF-8 no contiene ni el byte FE ni el FF. Esto asegura que un UTF-8 corriente nunca se ve como una corriente UTF-16 empezando por T + FEFF (marca de orden de bytes)

La página también muestra una gran comparación entre las ventajas y desventajas de cada tipo de codificación de caracteres.

UTF16 (UCS2)

utiliza 2 bytes a 4 bytes para cada símbolo.

UTF32 (UCS4)

utiliza 4 bytes siempre para cada símbolo.

char solo significa un byte de datos y no es una codificación real. No es análogo a UTF8/UTF16/ascii. Un puntero char * puede referirse a cualquier tipo de datos y cualquier codificación.

STL:

de std :: wstring y std :: string no están diseñados para de longitud variable, como la codificación de caracteres UTF-8 y UTF-16 Tanto STL.

Cómo implementar:

Tome un vistazo a la biblioteca iconv. iconv es una biblioteca de conversión de codificación de caracteres de gran alcance usada por proyectos tales como libxml (XML C analizador de Gnome)

Otros grandes recursos en la codificación de caracteres:

+2

Brian, esto está mal. UTF-16 usa de 2 a 4 bytes. Solo UTF-32 tiene un ancho fijo de bytes (= 4). La mayoría de las implementaciones de UTF-16 simplemente no se extienden más allá del BMP y, por lo tanto, solo admiten un conjunto de caracteres limitado. –

+0

Gracias Konrad, actualicé mi descripción. –

+0

Personalmente, consideraría usar un char * para señalar que los datos UTF16 son un error. –

4

Los diversos estándares UTF son formas de codificar "puntos de código". Un punto de código es el índice en el conjunto de caracteres Unicode.

Otra codificación es UCS2 que siempre es de 16 bits, y por lo tanto no es compatible con el rango completo Unicode.

Es bueno saber también que un punto de código no es igual a un carácter. Por ejemplo, un personaje como å puede representarse como un punto de código o como dos puntos de código uno para la a y uno para el anillo.

Comparando dos cadenas Unicode, por lo tanto, se requiere normalización para obtener la representación canónica antes de la comparación.

1

También está el problema con las fuentes. Hay dos formas de manejar las fuentes. O bien utiliza una fuente gigantesca con glifos para todos los caracteres Unicode que necesita (creo que las versiones recientes de Windows vienen con una o dos de esas fuentes). O utiliza una biblioteca som capaz de combinar glifos de varias fuentes dedicadas a subconjuntos del estándar Unicode.

Cuestiones relacionadas