¿Cuál es la diferencia entre UTF-8 y Unicode?

Resuelto sarsnake asked hace 15 años • 19 respuestas

He escuchado opiniones contradictorias de personas, según la página UTF-8 de Wikipedia .

Son lo mismo ¿no? ¿Alguien puede aclarar?

sarsnake avatar Mar 14 '09 00:03 sarsnake
Aceptado

Para ampliar las respuestas que otros han dado:

Tenemos muchos idiomas con muchos caracteres que idealmente deberían mostrar las computadoras. Unicode asigna a cada carácter un número único o punto de código.

Las computadoras manejan números como bytes... omitiendo un poco de historia aquí e ignorando los problemas de memoria, las computadoras de 8 bits tratarían un byte de 8 bits como la unidad numérica más grande fácilmente representada en el hardware, las computadoras de 16 bits se expandirían. eso a dos bytes, y así sucesivamente.

Las codificaciones de caracteres antiguas, como ASCII, son de la era (pre) de los 8 bits e intentan meter el idioma dominante en la informática de la época, es decir, el inglés, en números que van del 0 al 127 (7 bits). Con 26 letras en el alfabeto, tanto en mayúsculas como en mayúsculas, números y signos de puntuación, funcionó bastante bien. ASCII se extendió en un octavo bit para otros idiomas distintos del inglés, pero los 128 números/puntos de código adicionales disponibles mediante esta expansión se asignarían a diferentes caracteres según el idioma que se muestra. Los estándares ISO-8859 son las formas más comunes de este mapeo; ISO-8859-1 e ISO-8859-15 (también conocidos como ISO-Latin-1, latin1 y sí, también hay dos versiones diferentes del estándar ISO 8859).

Pero eso no es suficiente cuando quieres representar caracteres de más de un idioma, por lo que agrupar todos los caracteres disponibles en un solo byte simplemente no funcionará.

Básicamente, existen dos tipos diferentes de codificaciones: una expande el rango de valores agregando más bits. Ejemplos de estas codificaciones serían UCS2 (2 bytes = 16 bits) y UCS4 (4 bytes = 32 bits). Sufren inherentemente el mismo problema que los estándares ASCII e ISO-8859, ya que su rango de valores aún es limitado, incluso si el límite es mucho más alto.

El otro tipo de codificación utiliza un número variable de bytes por carácter, y las codificaciones más comúnmente conocidas para esto son las codificaciones UTF. Todas las codificaciones UTF funcionan aproximadamente de la misma manera: usted elige un tamaño de unidad, que para UTF-8 es de 8 bits, para UTF-16 es de 16 bits y para UTF-32 es de 32 bits. Luego, el estándar define algunos de estos bits como banderas: si están configurados, entonces la siguiente unidad en una secuencia de unidades se considerará parte del mismo carácter. Si no están configurados, esta unidad representa un personaje completamente. Por lo tanto, los caracteres más comunes (inglés) solo ocupan un byte en UTF-8 (dos en UTF-16, 4 en UTF-32), pero los caracteres de otros idiomas pueden ocupar seis bytes o más.

Las codificaciones multibyte (debería decir multiunidad después de la explicación anterior) tienen la ventaja de que ocupan relativamente poco espacio, pero la desventaja es que operaciones como buscar subcadenas, comparaciones, etc. tienen que decodificar los caracteres en código Unicode. puntos antes de que se puedan realizar dichas operaciones (aunque existen algunos atajos).

Tanto los estándares UCS como los estándares UTF codifican los puntos de código tal como se definen en Unicode. En teoría, esas codificaciones podrían usarse para codificar cualquier número (dentro del rango que admite la codificación), pero, por supuesto, estas codificaciones se crearon para codificar puntos de código Unicode. Y esa es tu relación entre ellos.

Windows maneja las llamadas cadenas "Unicode" como cadenas UTF-16, mientras que la mayoría de los UNIX utilizan por defecto UTF-8 en estos días. Los protocolos de comunicación como HTTP tienden a funcionar mejor con UTF-8, ya que el tamaño de la unidad en UTF-8 es el mismo que en ASCII, y la mayoría de estos protocolos se diseñaron en la era ASCII. Por otro lado, UTF-16 ofrece el mejor rendimiento promedio de espacio/procesamiento al representar todos los lenguajes vivos.

El estándar Unicode define menos puntos de código de los que se pueden representar en 32 bits. Por lo tanto, a todos los efectos prácticos, UTF-32 y UCS4 se convirtieron en la misma codificación, ya que es poco probable que tenga que lidiar con caracteres de varias unidades en UTF-32.

Espero que eso complete algunos detalles.

 avatar Mar 13 '2009 17:03

Permítanme usar un ejemplo para ilustrar este tema:

A Chinese character:      汉
its Unicode value:        U+6C49
convert 6C49 to binary:   01101100 01001001

Nada mágico hasta ahora, es muy sencillo. Ahora, digamos que decidimos almacenar este carácter en nuestro disco duro. Para hacer eso, necesitamos almacenar el carácter en formato binario. Simplemente podemos almacenarlo como '01101100 01001001'. ¡Hecho!

Pero espera un minuto, ¿'01101100 01001001' es un carácter o dos caracteres? Sabías que este es un carácter porque te lo dije, pero cuando una computadora lo lee, no tiene idea. Entonces necesitamos algún tipo de codificación para decirle a la computadora que lo trate como tal.

Aquí es donde entran las reglas de UTF-8: https://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

Según la tabla anterior, si queremos almacenar este carácter usando el formato UTF-8, debemos anteponer nuestro carácter con algunos 'encabezados'. Nuestro carácter chino tiene 16 bits de largo (cuente el valor binario usted mismo), por lo que usaremos el formato de la fila 3 anterior, ya que proporciona suficiente espacio:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

Escribiendo el resultado en una línea:

11100110 10110001 10001001

¡Este es el valor binario UTF-8 del carácter chino! Compruébelo usted mismo: https://www.fileformat.info/info/unicode/char/6c49/index.htm

Resumen

A Chinese character:      汉
its Unicode value:        U+6C49
convert 6C49 to binary:   01101100 01001001
encode 6C49 as UTF-8:     11100110 10110001 10001001

PD: Si quieres aprender este tema en Python, haz clic aquí .

Cheng avatar Jan 14 '2015 09:01 Cheng

Lamentablemente, "Unicode" se utiliza de diferentes maneras, según el contexto. Su uso más correcto (IMO) es como un conjunto de caracteres codificados , es decir, un conjunto de caracteres y una correlación entre los caracteres y los puntos de código enteros que los representan.

UTF-8 es una codificación de caracteres, una forma de convertir secuencias de bytes a secuencias de caracteres y viceversa. Cubre todo el conjunto de caracteres Unicode. ASCII está codificado como un solo byte por carácter, y otros caracteres toman más bytes dependiendo de su punto de código exacto (hasta 4 bytes para todos los puntos de código definidos actualmente, es decir, hasta U-0010FFFF, y de hecho, 4 bytes podrían soportar hasta U-001FFFFFF).

Cuando se utiliza "Unicode" como nombre de una codificación de caracteres (por ejemplo, como propiedad .NET Encoding.Unicode ), normalmente significa UTF-16 , que codifica los caracteres más comunes como dos bytes. Algunas plataformas (en particular .NET y Java) utilizan UTF-16 como codificación de caracteres "nativa". Esto genera problemas complicados si necesita preocuparse por los caracteres que no se pueden codificar en un único valor UTF-16 (están codificados como "pares sustitutos"), pero la mayoría de los desarrolladores nunca se preocupan por esto, IME.

Algunas referencias sobre Unicode:

  • El sitio web del consorcio Unicode y en particular la sección de tutoriales .
  • El artículo de Joel.
  • Mi propio artículo (orientado a .NET)
Jon Skeet avatar Mar 13 '2009 17:03 Jon Skeet