UTF-8, UTF-16 y UTF-32

Resuelto asked hace 15 años • 14 respuestas

¿Cuáles son las diferencias entre UTF-8, UTF-16 y UTF-32?

Entiendo que todos almacenarán Unicode y que cada uno usa una cantidad diferente de bytes para representar un carácter. ¿Hay alguna ventaja en elegir uno sobre el otro?

 avatar Jan 31 '09 00:01
Aceptado

UTF-8 tiene una ventaja en el caso en que los caracteres ASCII representan la mayoría de los caracteres en un bloque de texto, porque UTF-8 los codifica en 8 bits (como ASCII). También resulta ventajoso que un archivo UTF-8 que contenga sólo caracteres ASCII tenga la misma codificación que un archivo ASCII.

UTF-16 es mejor cuando ASCII no es predominante, ya que utiliza principalmente 2 bytes por carácter. UTF-8 comenzará a utilizar 3 o más bytes para los caracteres de orden superior, mientras que UTF-16 permanecerá en solo 2 bytes para la mayoría de los caracteres.

UTF-32 cubrirá todos los caracteres posibles en 4 bytes. Esto lo hace bastante hinchado. No se me ocurre ninguna ventaja al usarlo.

AnthonyWJones avatar Jan 30 '2009 17:01 AnthonyWJones

En breve:

  • UTF-8: codificación de ancho variable, compatible con versiones anteriores de ASCII. Los caracteres ASCII (U+0000 a U+007F) ocupan 1 byte, los puntos de código U+0080 a U+07FF ocupan 2 bytes, los puntos de código U+0800 a U+FFFF ocupan 3 bytes, los puntos de código U+10000 a U+10FFFF tomar 4 bytes. Bueno para texto en inglés, no tan bueno para texto asiático.
  • UTF-16: codificación de ancho variable. Los puntos de código U+0000 a U+FFFF ocupan 2 bytes, los puntos de código U+10000 a U+10FFFF ocupan 4 bytes. Malo para texto en inglés, bueno para texto asiático.
  • UTF-32: codificación de ancho fijo. Todos los puntos de código ocupan cuatro bytes. Un enorme consumidor de memoria, pero rápido de operar. Raramente usado.

En extenso: ver Wikipedia: UTF-8 , UTF-16 y UTF-32 .

Adam Rosenfield avatar Jan 30 '2009 17:01 Adam Rosenfield
  • UTF-8 es una variable de 1 a 4 bytes.

  • UTF-16 es una variable de 2 o 4 bytes.

  • UTF-32 tiene 4 bytes fijos.

Quassnoi avatar Jan 30 '2009 17:01 Quassnoi

Unicode define un único conjunto de caracteres enorme, asignando un valor entero único a cada símbolo gráfico (esa es una simplificación importante y en realidad no es cierta, pero se acerca lo suficiente para los propósitos de esta pregunta). UTF-8/16/32 son simplemente diferentes formas de codificar esto.

En resumen, UTF-32 utiliza valores de 32 bits para cada carácter. Eso les permite usar un código de ancho fijo para cada carácter.

UTF-16 usa 16 bits de forma predeterminada, pero eso solo le brinda 65k caracteres posibles, lo cual no es suficiente para el conjunto Unicode completo. Entonces algunos caracteres usan pares de valores de 16 bits.

Y UTF-8 usa valores de 8 bits de forma predeterminada, lo que significa que los 127 primeros valores son caracteres de un solo byte de ancho fijo (el bit más significativo se usa para indicar que este es el inicio de una secuencia de varios bytes, dejando 7 bits para el valor de carácter real). Todos los demás caracteres están codificados como secuencias de hasta 4 bytes (si la memoria no me falla).

Y eso nos lleva a las ventajas. Cualquier carácter ASCII es directamente compatible con UTF-8, por lo que para actualizar aplicaciones heredadas, UTF-8 es una opción común y obvia. En casi todos los casos, también utilizará la menor cantidad de memoria. Por otro lado, no puedes ofrecer ninguna garantía sobre el ancho de un carácter. Puede tener 1, 2, 3 o 4 caracteres de ancho, lo que dificulta la manipulación de cadenas.

UTF-32 es lo contrario, utiliza la mayor cantidad de memoria (cada carácter tiene un ancho fijo de 4 bytes), pero, por otro lado, sabes que cada carácter tiene esta longitud precisa, por lo que la manipulación de cadenas se vuelve mucho más simple. Puede calcular la cantidad de caracteres en una cadena simplemente a partir de la longitud en bytes de la cadena. No puedes hacer eso con UTF-8.

UTF-16 es un compromiso. Permite que la mayoría de los caracteres quepan en un valor de 16 bits de ancho fijo. Entonces, siempre que no tengas símbolos chinos, notas musicales u otros, puedes asumir que cada carácter tiene 16 bits de ancho. Utiliza menos memoria que UTF-32. Pero en cierto modo es "lo peor de ambos mundos". Casi siempre utiliza más memoria que UTF-8 y aún así no evita el problema que afecta a UTF-8 (caracteres de longitud variable).

Por último, suele resultar útil optar por lo que admite la plataforma. Windows usa UTF-16 internamente, por lo que en Windows esa es la opción obvia.

Linux varía un poco, pero generalmente usan UTF-8 para todo lo que sea compatible con Unicode.

Respuesta breve: las tres codificaciones pueden codificar el mismo conjunto de caracteres, pero representan cada carácter como secuencias de bytes diferentes.

jalf avatar Jan 30 '2009 17:01 jalf