Qual é a diferença entre UTF-8 e ISO-8859-1 ?
Qual é a diferença entre UTF-8 e ISO-8859-1 ?
Respostas:
UTF-8 é uma codificação multibyte que pode representar qualquer caractere Unicode. ISO 8859-1 é uma codificação de byte único que pode representar os primeiros 256 caracteres Unicode. Ambos codificam ASCII exatamente da mesma maneira.
A Wikipedia explica as duas razoavelmente bem: UTF-8 vs Latin-1 (ISO-8859-1). O primeiro é uma codificação de comprimento variável, a última codificação de comprimento fixo de byte único. O Latin-1 codifica apenas os primeiros 256 pontos de código do conjunto de caracteres Unicode, enquanto o UTF-8 pode ser usado para codificar todos os pontos de código. No nível de codificação física, apenas os pontos de código 0 - 127 são codificados de forma idêntica; os pontos de código 128 - 255 diferem tornando-se uma sequência de 2 bytes com UTF-8, enquanto são bytes únicos com Latin-1.
UTF é uma família de esquemas de codificação de vários bytes que podem representar pontos de código Unicode que podem representar até 2 ^ 31 [aproximadamente 2 bilhões] caracteres. UTF-8 é um sistema de codificação flexível que usa entre 1 e 4 bytes para representar os primeiros 2 ^ 21 [aproximadamente 2 milhões] pontos de código.
Para encurtar a história: qualquer caractere com um ponto de código / representação ordinal abaixo de 127, também conhecido como ASCII com segurança de 7 bits, é representado pela mesma sequência de 1 byte que a maioria das outras codificações de byte único. Qualquer caractere com um ponto de código acima de 127 é representado por uma sequência de dois ou mais bytes, com os detalhes da codificação melhor explicados aqui .
ISO-8859 é uma família de esquemas de codificação de byte único usados para representar alfabetos que podem ser representados no intervalo de 127 a 255. Esses vários alfabetos são definidos como "partes" no formato ISO-8859- n , o mais familiar de provavelmente sendo ISO-8859-1, também conhecido como 'Latin-1'. Assim como no UTF-8, o ASCII com segurança de 7 bits permanece inalterado, independentemente da família de codificação usada.
A desvantagem deste esquema de codificação é sua incapacidade de acomodar idiomas compostos por mais de 128 símbolos ou de exibir com segurança mais de uma família de símbolos ao mesmo tempo. Além disso, as codificações ISO-8859 caíram em desuso com o aumento da UTF. O "Grupo de Trabalho" da ISO encarregado de sua dissolução em 2004, deixando a manutenção por conta do subcomitê pai.
ASCII: 7 bits. 128 pontos de código.
ISO-8859-1: 8 bits. 256 pontos de código.
UTF-8: 8-32 bits (1-4 bytes). 1.112.064 pontos de código.
O ISO-8859-1 e o UTF-8 são compatíveis com o ASCII, mas o UTF-8 não é compatível com o ISO-8859-1:
#!/usr/bin/env python3
c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))
Resultado:
©
b'\xc2\xa9'
b'\xa9'
A ISO-8859-1 é um padrão herdado da década de 1980. Ele pode representar apenas 256 caracteres, sendo adequado apenas para alguns idiomas do mundo ocidental. Mesmo para muitos idiomas suportados, alguns caracteres estão ausentes. Se você criar um arquivo de texto nessa codificação e tentar copiar / colar alguns caracteres chineses, verá resultados estranhos. Então, em outras palavras, não use. O Unicode dominou o mundo e o UTF-8 é praticamente o padrão hoje em dia, a menos que você tenha alguns motivos legados (como cabeçalhos HTTP que precisam ser compatíveis com tudo).
Mais uma coisa importante a ser realizada: se você vir iso-8859-1
, provavelmente se refere ao Windows-1252, em vez da ISO / IEC 8859-1 . Eles diferem no intervalo de 0x80 a 0x9F, onde ISO 8859-1 possui os códigos de controle C1 e Windows-1252 possui caracteres visíveis úteis.
Por exemplo, ISO 8859-1 possui 0x85 como caractere de controle (em Unicode, U + 0085, ``), enquanto Windows-1252 possui reticências horizontais (em Unicode, U + 2026 ELLIPSIS HORIZONTAL, …
).
A especificação de codificação WHATWG (conforme usada pelo HTML) declara expressamente iso-8859-1
ser um rótulo para windows-1252
e os navegadores da Web não suportam a ISO 8859-1 de forma alguma: a especificação HTML diz que todas as codificações na especificação Encoding devem ser suportadas, e não mais que .
Também interessante, as referências de caracteres numéricos HTML usam essencialmente Windows-1252 para valores de 8 bits, em vez de pontos de código Unicode; por https://html.spec.whatwg.org/#numeric-character-reference-end-state , …
produzirá U + 2026 em vez de U + 0085.
Minha razão para pesquisar essa questão foi do ponto de vista, é como eles são compatíveis. O conjunto de caracteres Latin1 (iso-8859) é 100% compatível para ser armazenado em um armazenamento de dados utf8. Todos os caracteres ASCII e ASCII estendido serão armazenados como byte único.
Indo de outra maneira, de utf8 para Latin1 charset pode ou não funcionar. Se houver algum caractere de 2 bytes (caracteres além do estendido-ascii 255), eles não serão armazenados em um armazenamento de dados Latin1.