Unicode, Unicode Big Endian ou UTF-8? Qual é a diferença? Qual formato é melhor?


19

Quando tento salvar um arquivo de texto com texto não em inglês no bloco de notas, obtenho a opção de escolher entre Unicode , Unicode Big Endian e UTF-8 . Qual é a diferença entre esses formatos?

Supondo que eu não queira nenhuma compatibilidade com versões anteriores (com versões ou aplicativos mais antigos do SO) e não me importe com o tamanho do arquivo, qual desses formatos é melhor?

(Suponha que o texto possa estar em idiomas como chinês ou japonês, além de outros idiomas.)

Nota: Das respostas e comentários abaixo, parece que no jargão do bloco de notas o Unicode é UTF-16 (Little Endian), o Unicode Big Endian é o UTF-16 (Big Endian) e o UTF-8 é bem o UTF-8.


Respostas:


19

Não sei. O que é melhor: uma serra ou um martelo? :-)

Unicode não é UTF

Há um pouco no artigo que é um pouco mais relevante para o assunto em questão:

  • O UTF-8 concentra-se em minimizar o tamanho de bytes para a representação de caracteres do conjunto ASCII (representação de comprimento variável: cada caractere é representado em 1 a 4 bytes, e os caracteres ASCII cabem em 1 byte). Como Joel coloca:

"Olhem todos esses zeros!", Disseram eles, uma vez que eram americanos e estavam vendo textos em inglês que raramente usavam pontos de código acima de U + 00FF. Também eram hippies liberais na Califórnia que queriam conservar (desdém). Se fossem texanos, não se importariam em devorar o dobro do número de bytes. Mas esses covardes californianos não suportavam a idéia de dobrar a quantidade de armazenamento necessária para as cordas

  • O UTF-32 foca na exaustividade e na representação de comprimento fixo, usando 4 bytes para todos os caracteres. É a tradução mais direta, mapeando diretamente o ponto de código Unicode para 4 bytes. Obviamente, não é muito eficiente em tamanho.

  • UTF-16 é um compromisso, usando 2 bytes na maioria das vezes, mas expandindo para 2 * 2 bytes por caractere para representar certos caracteres, aqueles não incluídos no Plano Multilíngue Básico (BMP).

Consulte também o mínimo absoluto que todo desenvolvedor de software deve saber absolutamente, positivamente sobre Unicode e conjuntos de caracteres (sem desculpas!)


4
O problema vem do fato de o Unicode ser uma 'codificação', mas não no sentido de números em bytes. UTF-8/16/32 são todas codificações Unicode, mas o próprio Unicode é um mapeamento de símbolos para números. Eles poderiam ter usado uma terminologia mais exclusiva para evitar essa confusão, eu acho.
21139 jerryjvl

4
Independentemente disso, para o OP da questão, é provável que o aplicativo signifique 'UTF-16' onde diz 'Unicode'.
21139 jerryjvl

3
Não tenho certeza de que o objetivo do UTF-8 seja "conservação", em oposição à compatibilidade com o ASCII.
Mr. Shiny and New #

@ Johannes: O Unicode Consortium decidiu nunca atribuir pontos de código acima de U + 10FFFF porque eles não podem ser representados no UTF-16. Isso teve o efeito de restringir UTF-8 a 4 bytes.
user46971

1
"Unicode não é UTF" - para muitos, é WTF;)
mlvljr

4

Para idiomas europeus, o UTF-8 é menor. Para as línguas orientais, a diferença não é tão clara.

Ambos manipularão todos os caracteres Unicode possíveis, portanto, isso não fará diferença na compatibilidade.


3

Existem mais codificações de caracteres Unicode do que você imagina.

  • UTF 8

    A codificação UTF-8 é de largura variável, variando de 1 a 4 bytes, com os bits superiores de cada byte reservados como bits de controle. Os bits iniciais do primeiro byte indicam o número total de bytes usados ​​para esse caractere. O valor escalar do ponto de código de um caractere é a concatenação dos bits que não são de controle. Nesta tabela, xrepresenta os 8 bits mais baixos do valor Unicode, yrepresenta os próximos 8 bits mais altos e zrepresenta os bits mais altos que isso.

    Unicode              Byte1     Byte2     Byte3     Byte4
    U+0000-U+007F       0xxxxxxx            
    U+0080-U+07FF       110yyyxx  10xxxxxx          
    U+0800-U+FFFF       1110yyyy  10yyyyxx  10xxxxxx    
    U+10000-U+10FFFF    11110zzz  10zzyyyy  10yyyyxx  10xxxxxx
    
  • UCS-16
  • UCS-16BE
  • UCS-16LE

  • UTF-16
  • UTF-16BE
  • UTF-16LE

  • UTF-32
  • UTF-32-BE

1
Existem mais codificações de caracteres Unicode do que você listou. Por exemplo, UTF-1 , UTF-7 , UTF-EBCDIC , GB-18030 , MIME , UTF-9 e UTF-18 ... Você também pode usar qualquer esquema de codificação binária para codificar dados Unicode. Leia mais Comparação de codificações Unicode
phuclv

1

"Unicode" é outro termo para "UTF-16", que é uma codificação do conjunto de caracteres Unicode em dezesseis bits por caractere. UTF-8 o codifica em oito bits por caractere.

Nos dois casos, qualquer estouro é alocado para outros 16 ou oito bits.


Qual é o melhor então?
R. Martinho Fernandes

"depende da situação.
318 John Saunders

Embora, para esta pergunta específica, pareça que "Unicode" seja realmente ABUSADO como outro termo para "UTF-16", não é tão geral assim - veja a resposta de Jason.
Arjan #

1
Você quer dizer "por unidade de código", não "por caractere"; UTF-8 e UTF-16 podem usar várias unidades de código para representar um caractere. E "Unicode" e "UTF-16" NÃO são a mesma coisa, exceto na terminologia da Microsoft.
user46971

1

A única vantagem real de arquivos pequenos, como arquivos de texto, é o tamanho resultante. UTF-8 geralmente produz arquivos menores. Mas essa diferença pode ser menos pronunciada no texto em chinês / japonês.


Lembre-se de que também há uma diferença na largura de banda da rede e no uso de memória.
Jason Baker

1
"UTF-8 geralmente produz arquivos menores": geralmente não. UTF-8 produz arquivos menores para arquivos ASCII. Se um arquivo consistir apenas em pontos de código Unicode acima de U + 0800, será maior em UTF-8 do que em UTF-16.
Sleske 17/11/2009

0

Em uma palavra, Unicode é um conjunto de caracteres , enquanto Unicode Big Endian e utf-8 são duas codificações , que são usadas para armazenar caracteres como 01 em um computador.


E a diferença é ...?
David Richerby
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.