utf 8 - acentos - ¿Cuál es la diferencia entre UTF-8 e ISO-8859-1?
utf-8 ñ (7)
UTF
UTF es una familia de esquemas de codificación de múltiples bytes que pueden representar puntos de código Unicode que pueden ser representativos de hasta 2 ^ 31 caracteres [aproximadamente 2 billones]. UTF-8 es un sistema de codificación flexible que usa entre 1 y 4 bytes para representar los primeros 2 ^ 25 [aproximadamente 32 millones] puntos de código.
Larga historia corta: cualquier personaje con un punto de código / representación ordinal por debajo de 127, también conocido como ASCII de 7 bits es representado por la misma secuencia de 1 byte que la mayoría de las demás codificaciones de un solo byte. Cualquier carácter con un punto de código por encima de 127 está representado por una secuencia de dos o más bytes, con el detalle de la codificación mejor explicado here .
ISO-8859
ISO-8859 es una familia de esquemas de codificación de un solo byte utilizados para representar alfabetos que pueden representarse dentro del rango de 127 a 255. Estos diversos alfabetos se definen como "partes" en el formato ISO-8859- n , el más conocido de estos probablemente sean ISO-8859-1 alias ''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 adaptarse a los idiomas que comprenden más de 128 símbolos, o para mostrar de forma 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" de la ISO a cargo de su disolución se disolvió en 2004, dejando el mantenimiento a su subcomité principal.
¿Cuál es la diferencia entre UTF-8 e ISO-8859-1 ?
Desde otra perspectiva, los archivos que tanto las codificaciones Unicode como Ascii no pueden leer porque tienen un byte 0xc0
en ellos, parecen ser leídos correctamente por iso-8859-1. La advertencia es que el archivo no debe tener caracteres Unicode, por supuesto.
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 creas un archivo de texto con esta codificación e intentas copiar / pegar algunos caracteres chinos, verás resultados extraños. Así que en otras palabras, no lo uses. Unicode se ha apoderado del mundo y UTF-8 es prácticamente el estándar en estos días, a menos que tenga algunas razones heredadas (como los encabezados HTTP que deben ser compatibles con todo).
Mi razón para investigar esta pregunta fue desde la perspectiva, es de qué manera son compatibles. El conjunto de caracteres Latin1 (iso-8859) es 100% compatible para ser almacenado en un almacén de datos utf8. Todos los caracteres ascii y extended-ascii se almacenarán como un solo byte.
Yendo a la inversa, de utf8 a Latin1 charset puede o no funcionar. Si hay caracteres de 2 bytes (caracteres más allá del extendido-ascii 255), no se almacenarán en un almacén de datos Latin1.
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 ambos razonablemente bien: UTF-8 vs Latin-1 (ISO-8859-1). Former es una codificación de longitud variable, esta última es una 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 secuencia de 2 bytes con UTF-8 mientras que son bytes simples con Latin-1.
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''