Qual é a diferença entre UTF-8 e ISO-8859-1?

Respostas:

321

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.

Ignacio Vazquez-Abrams
fonte
11
Uma coisa a notar que o ASCII se estende de 0 a 127 apenas. O MSB é sempre 0.
Hritik
3
Quando os pontos de código acima de 127 são definidos, o sistema de codificação é uma versão do ASCII estendido.
Rohan Bhale 01/08/19
11
@RohanBhale Não use a frase Extended ASCII; isso só causará confusão.
Sr. Lister
Mas ascii estendido pode ser o termo correto. Eu li em vários recursos
Rohan Bhale
135

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.

StaxMan
fonte
@mu talvez minha declaração seja ambígua, mas não está incorreta - eu não estava falando sobre seqüências de bytes codificadas, mas sim sobre conjuntos de caracteres sendo codificados; significando que o ISO-8859-1 é usado para codificar os primeiros 256 pontos de código do conjunto de caracteres Unicode.
precisa saber é o seguinte
Seu esclarecimento funciona para mim e "ambíguo" teria sido uma escolha melhor de palavras do que "incorreto".
mu é muito curto
83

UTF

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

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.

Sammitch
fonte
11
+1 por responder à pergunta, mas indo além e oferecendo informações sobre codificações relacionadas. Re: código de pontos para UTF-8, de acordo com stackoverflow.com/a/38488358/3353984 , UTF-8 suporta 2 ^ 21 pontos de código. Isso é um erro ou pode ser necessária uma correção aqui?
Tom Loredo
11
Unicode é realmente 17 planos de 2 ^ 16 pontos de código. 0x00_0000 a 0x1F_FFFF. Os 17 aviões podem acomodar 1.114.112 pontos de código. Destes, 2.048 são substitutos, 66 não são caracteres e 137.468 são reservados para uso privado, deixando 974.530 para atribuição pública. Cerca de 1 milhão. Consulte Quantos caracteres o UTF-8 pode codificar? .
georgeawg
22
  • 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'
Cyker
fonte
21

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).

Shital Shah
fonte
11
Eu tinha visto onde o Umlaut não é supostamente convertido com UTF8. Vimos exemplos disso e, na busca, encontramos a ISO-8859-1 e parece funcionar. Temos muitos cientistas alemães com quem trabalhamos.
Aggie Jon de 87
4
Os trema são representados como dois caracteres em utf8. Eles convertem bem e funcionam bem. O problema vem de programas que esperam 1 byte por caractere. Para esses programas herdados, a ISO-8859-1 possui trema de 1 byte.
Erik Aronesty 13/09/18
3

De outra perspectiva, os arquivos que as codificações unicode e ascii não conseguem ler porque possuem um byte 0xc0, parecem ser lidos pelo iso-8859-1 corretamente. A ressalva é que o arquivo não deve conter caracteres unicode, é claro.

Nikhil VJ
fonte
2

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-1ser um rótulo para windows-1252e 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.

Chris Morgan
fonte
Opa! Pensei que tivesse escrito isso, mas o perdi reescrevendo. Eu coloquei agora.
Chris Morgan
0

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.

Alan Jurgensen
fonte
2
Útil, mas acho que você quis dizer 127 em vez de 255 no ASCII estendido 255?
31917
18
O Latin-1 ou o iso-8859-1 não é 100% compatível para ser armazenado no utf8. Qualquer caractere latino-n ou iso-8859-n acima de 127 não será convertido em um único caractere byte utf-8. No entanto, para os valores de 1 a 127, eles serão traduzidos exatamente.
Marlin Pierce
4
Essa resposta é um pouco confusa no uso do termo "ascii estendido", que é apenas um termo para se referir a qualquer codificação de caracteres que não seja ASCII. UTF-8 e latin-1 são exemplos de codificações ASCII estendidas. Porém, caracteres latin-1 não ascii (ou seja, pontos de código acima de 127) não podem ser codificados como um único byte em UTF-8.
Rdb 18/04