¿Cuál es la diferencia entre UTF-8 e ISO-8859-1 ?
¿Cuál es la diferencia entre UTF-8 e ISO-8859-1 ?
Respuestas:
UTF-8 es una codificación multibyte que puede representar cualquier carácter Unicode. ISO 8859-1 es una codificación de un solo byte que puede representar los primeros 256 caracteres Unicode. Ambos codifican ASCII exactamente de la misma manera.
Wikipedia explica ambas cosas razonablemente bien: UTF-8 vs Latin-1 (ISO-8859-1). La primera es una codificación de longitud variable, la última codificación de longitud fija de un solo byte. Latin-1 codifica solo los primeros 256 puntos de código del juego de caracteres Unicode, mientras que UTF-8 puede usarse para codificar todos los puntos de código. A nivel de codificación física, solo los puntos de código 0 - 127 se codifican de forma idéntica; los puntos de código 128-255 difieren al convertirse en una secuencia de 2 bytes con UTF-8, mientras que son bytes únicos con Latin-1.
UTF es una familia de esquemas de codificación de varios bytes que pueden representar puntos de código Unicode que pueden ser representativos de hasta 2 ^ 31 [aproximadamente 2 mil millones] caracteres. UTF-8 es un sistema de codificación flexible que utiliza entre 1 y 4 bytes para representar los primeros 2 ^ 21 [aproximadamente 2 millones] puntos de código.
En pocas palabras: cualquier personaje con un punto de código / representación ordinal por debajo de 127, también conocido como ASCII de 7 bits seguro, está representado por la misma secuencia de 1 byte que la mayoría de las otras codificaciones de un solo byte. Cualquier carácter con un punto de código superior a 127 está representado por una secuencia de dos o más bytes, con los detalles de la codificación mejor explicados aquí .
ISO-8859 es una familia de esquemas de codificación de un solo byte utilizados para representar alfabetos que se pueden representar dentro del rango de 127 a 255. Estos diversos alfabetos se definen como "partes" en el formato ISO-8859- n , el más familiar de estos probablemente sean ISO-8859-1, también conocido como 'Latin-1'. Al igual que con UTF-8, el ASCII seguro de 7 bits no se ve afectado independientemente de la familia de codificación utilizada.
El inconveniente de este esquema de codificación es su incapacidad para acomodar idiomas compuestos por más de 128 símbolos, o para mostrar de manera segura más de una familia de símbolos a la vez. Además, las codificaciones ISO-8859 han caído en desgracia con el aumento de UTF. El "Grupo de trabajo" ISO a cargo de que se disolviera en 2004, dejando el mantenimiento a su subcomité matriz.
ASCII: 7 bits. 128 puntos de código.
ISO-8859-1: 8 bits. 256 puntos de código.
UTF-8: 8-32 bits (1-4 bytes). 1.112.064 puntos de código.
Tanto ISO-8859-1 como UTF-8 son compatibles con ASCII, pero UTF-8 no es compatible con ISO-8859-1:
#!/usr/bin/env python3
c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))
Salida:
©
b'\xc2\xa9'
b'\xa9'
ISO-8859-1 es un estándar heredado de la década de 1980. Solo puede representar 256 caracteres, por lo que solo es adecuado para algunos idiomas en el mundo occidental. Incluso para muchos idiomas compatibles, faltan algunos caracteres. Si crea un archivo de texto con esta codificación e intenta copiar / pegar algunos caracteres chinos, verá resultados extraños. En otras palabras, no lo use. Unicode se ha apoderado del mundo y UTF-8 es prácticamente el estándar en estos días a menos que tenga algunos motivos heredados (como los encabezados HTTP que deben ser compatibles con todo).
Una cosa más importante a tener en cuenta: si ve iso-8859-1
, probablemente se refiere a Windows-1252 en lugar de a ISO / IEC 8859-1 . Difieren en el rango de 0x80–0x9F, donde ISO 8859-1 tiene los códigos de control C1 y Windows-1252 tiene caracteres visibles útiles en su lugar.
Por ejemplo, ISO 8859-1 tiene 0x85 como un carácter de control (en Unicode, U + 0085, ``), mientras que Windows-1252 tiene puntos suspensivos horizontales (en Unicode, U + 2026 ELIPSIS HORIZONTAL, …
).
La especificación WHATWG Encoding (tal como la utiliza HTML) declara expresamente iso-8859-1
que es una etiqueta windows-1252
y los navegadores web no admiten ISO 8859-1 de ninguna manera: la especificación HTML dice que todas las codificaciones en la especificación Encoding deben ser compatibles, y no más .
También de interés, las referencias de caracteres numéricos HTML utilizan esencialmente Windows-1252 para valores de 8 bits en lugar de puntos de código Unicode; por https://html.spec.whatwg.org/#numeric-character-reference-end-state , …
producirá U + 2026 en lugar de U + 0085.
Mi razón para investigar esta pregunta fue desde la perspectiva, es de qué manera son compatibles. Latin1 charset (iso-8859) es 100% compatible para almacenarse en un almacén de datos utf8. Todos los caracteres ascii y ascii extendido se almacenarán como un solo byte.
En el otro sentido, desde utf8 a Latin1 charset puede o no funcionar. Si hay caracteres de 2 bytes (caracteres más allá de ascii 255 extendido) no se almacenarán en un almacén de datos Latin1.