UTF8 vs. UTF16 vs. char * vs. qué? ¡Que alguien me explique este desastre!
-
05-07-2019 - |
Pregunta
Me las arreglé para ignorar todo este material de caracteres de múltiples bytes, pero ahora necesito hacer un trabajo de UI y sé que mi ignorancia en esta área me alcanzará. ¿Puede alguien explicar en unos pocos párrafos o menos solo 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)?
Solución
EDIT 20140523 : También, vea Caracteres, símbolos y El milagro de Unicode de Tom Scott en YouTube: son menos de diez minutos y una maravillosa explicación del brillante 'pirateo' que es UTF-8
Otros consejos
Una codificación de caracteres consiste en una secuencia de códigos en los que cada uno busca un símbolo de un conjunto de caracteres determinado. Consulte este buen artículo en Wikipedia sobre codificación de caracteres .
UTF8 (UCS) utiliza de 1 a 4 bytes para cada símbolo Wikipedia ofrece 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 una secuencia de múltiples bytes. Determinar 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 múltiples bytes tienen 10 como sus dos más bits significativos.
- Un flujo UTF-8 no contiene el byte FE ni FF. Esto asegura que un La transmisión UTF-8 nunca se parece a una UTF-16 transmisión comenzando con U + 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.
Utiliza de 2 bytes a 4 bytes para cada símbolo.
usa 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 hacer referencia a cualquier tipo de datos y cualquier codificación.
STL:
Ambos stl's std :: wstring y std :: string no están diseñados para Codificaciones de caracteres de longitud variable como UTF-8 y UTF-16.
Cómo implementar:
Echa un vistazo a la biblioteca iconv. iconv es una potente biblioteca de conversión de codificación de caracteres utilizada por proyectos como libxml (analizador XML C de Gnome)
Otros excelentes recursos sobre codificación de caracteres:
- Characters vs. Bytes de tbray.org
- conjuntos de caracteres de la IANA
- www.cs.tut.fi's Un tutorial sobre problemas de código
- El mínimo absoluto que cada desarrollador de software debe conocer absolutamente, positivamente sobre Unicode y conjuntos de caracteres (¡sin excusas! ) (mencionado por primera vez por @Dylan Beattie)
Sabiduría recibida sugiere que el artículo de Spolsky se pierde Un par de puntos importantes.
Este artículo se recomienda como más completo: El estándar Unicode®: una introducción técnica
Este artículo también es una buena introducción: Lo básico de Unicode
Este último en particular ofrece una descripción general de las formas y esquemas de codificación de caracteres para Unicode.
Los distintos estándares de UTF son formas de codificar los 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 de Unicode.
También es bueno saber que un punto de código no es igual a un carácter. Por ejemplo, un carácter 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.
La comparación de dos cadenas Unicode por lo tanto requiere la normalización para obtener la representación canónica antes de la comparación.
También está el problema con las fuentes. Hay dos formas de manejar las fuentes. O 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 fuentes de este tipo). O utiliza una biblioteca som capaz de combinar glifos de varias fuentes dedicadas a subconjuntos del estándar Unicode.