Qual é a diferença entre UTF-8 e Unicode

Tenho ouvido opiniões conflitantes das pessoas-de acordo com a Wikipédia, Veja aqui .

São a mesma coisa, não são? Alguém pode esclarecer?

Author: Raedwald, 0000-00-00

10 answers

Para expandir as respostas que outros deram:

Temos muitas línguas com muitos personagens que os computadores deveriam exibir idealmente. Unicode atribui a cada caractere um número único, ou ponto de código. Os computadores lidam com números como bytes... saltando um pouco da história aqui e ignorando problemas de endereçamento de memória, computadores de 8 bits tratariam um byte de 8 bits como a maior unidade numérica facilmente representada no hardware, computadores de 16 bits expandiriam isso para dois bytes, e assim por diante.

As codificações antigas de caracteres como ASCII são da era (pré-) de 8 bits, e tentar encaixar a linguagem dominante na computação na época, ou seja, inglês, em números que variam de 0 a 127 (7 bits). Com 26 letras no alfabeto, tanto em forma capital quanto Não-capital, números e sinais de pontuação, isso funcionou muito bem. ASCII foi estendido por um oitavo bit para outras línguas não-inglesas, mas os 128 números adicionais / pontos de código disponibilizados por esta expansão seria mapeado para diferentes caracteres, dependendo da linguagem que está sendo exibida. As normas ISO-8859 são as formas mais comuns deste mapeamento; ISO-8859 - 1 e ISO-8859-15 (também conhecidas como ISO-Latin-1, latin1, e sim existem duas versões diferentes da norma ISO 8859).

Mas isso não é suficiente quando você quer representar personagens de mais de uma língua, então encaixar todos os caracteres disponíveis em um único byte simplesmente não vai funcionar.

Existem essencialmente dois diferentes tipos de codificações: um expande o intervalo de valores adicionando mais bits. Exemplos destas codificações seriam UCS2 (2 bytes = 16 bits) e UCS4 (4 bytes = 32 bits). Eles sofrem de inerentemente o mesmo problema que ASCII e ISO-8859 standars, como seu intervalo de valores ainda é limitado, mesmo se o limite é muito maior.

O outro tipo de codificação usa um número variável de bytes por caractere, e as codificações mais conhecidas para isso são as codificações UTF. Todas as codificações UTF trabalhe aproximadamente da mesma maneira: você escolhe um tamanho unitário, que para UTF-8 é 8 bits, para UTF-16 é 16 bits, e para UTF-32 é 32 bits. O padrão então define alguns desses bits como bandeiras: se eles estão definidos, então a próxima unidade em uma sequência de unidades deve ser considerada parte do mesmo caractere. Se eles não estão definidos, esta unidade representa um personagem completamente. Assim, os caracteres mais comuns (inglês) ocupam apenas um byte em UTF-8( dois em UTF-16, 4 em UTF-32), mas outros caracteres podem ocupa seis bytes ou mais.

Codificações Multi-bytes (devo dizer multi-unit após a explicação acima) têm a vantagem de serem relativamente eficientes em termos de espaço, mas a desvantagem de operações como encontrar substrings, comparações, etc. todos têm que decodificar os caracteres para pontos de código unicode antes que tais operações possam ser realizadas (existem alguns atalhos, no entanto).

Tanto as normas UCS como as normas UTF codificam os pontos de código definidos no Unicode. Em teoria, essas codificações poderiam ser usadas para codificar qualquer número (dentro do intervalo dos suportes de codificação) - mas é claro que essas codificações foram feitas para codificar pontos de código Unicode. E essa é a tua relação entre eles.

O Windows lida com as chamadas strings "Unicode" como strings UTF-16, enquanto a maioria dos UNIXes padrão para UTF-8 nos dias de hoje. Protocolos de comunicação como o HTTP tendem a funcionar melhor com UTF-8, como o tamanho unitário em UTF-8 é o mesmo que em ASCII, e a maioria desses protocolos foram projetados no ASCII era. Por outro lado, UTF-16 dá o melhor desempenho médio de espaço/processamento ao representar todas as línguas vivas.

O padrão Unicode define menos pontos de código do que podem ser representados em 32 bits. Assim, para todos os propósitos práticos, UTF-32 e UCS4 se tornaram a mesma codificação, já que é improvável que você tenha que lidar com caracteres multi-unidades em UTF-32.

Espero que isso preencha alguns detalhes.
 398
Author: 0x499602D2, 2013-08-27 03:16:04

O"Unicode" é, infelizmente, usado de várias maneiras diferentes, dependendo do contexto. A sua utilização mais correcta (IMO) é como um conjunto de caracteres codificado - Isto é, um conjunto de caracteres e um mapeamento entre os caracteres e os pontos de código inteiros que os representam.

UTF-8 é uma codificação de caracteres - uma forma de conversão de sequências de bytes para seqüências de caracteres e vice-versa. Cobre todo o conjunto de caracteres Unicode. ASCII é codificado como um único byte por caractere, e outros personagens levar mais bytes, dependendo do exato ponto de código (até 4 bytes para todos os actualmente definidos pontos de código, isto é, de até U-0010FFFF, e, de fato, 4 bytes pode lidar com até U-001FFFFF).

When "Unicode" is used as the name of a character encoding (e.g. as the .net Encoding.Unicode ) normalmente significa UTF-16 , que codifica os caracteres mais comuns como dois bytes. Algumas plataformas (notavelmente. NET e Java) usam UTF-16 como seu codificação de caracteres" native". Isso leva a problemas Cabeludos se você precisa se preocupar com os personagens que não podem ser codificados em um único valor UTF-16 (Eles são codificados como "pares substitutos") - mas a maioria dos desenvolvedores nunca se preocupam com isso, IME.

Algumas referências em Unicode:

 178
Author: Jon Skeet, 2018-09-11 13:39:45

Deixe - me usar um exemplo para ilustrar este tópico:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
Nada de mágico até agora, é muito simples. Digamos que decidimos guardar esta personagem no nosso disco rígido. Para fazer isso, precisamos armazenar o personagem em formato binário. Podemos simplesmente armazená-lo como é '01101100 01001001'. Feito! Mas espera um minuto, o "01101100 01001001" é um ou dois caracteres? Sabias que era uma personagem porque te disse, Mas quando um computador a lê, não faz ideia. Então precisamos algum tipo de" codificação " para dizer ao computador para tratá-lo como um. É aqui que entram as regras de UTF-8: http://www.fileformat.info/info/unicode/utf8.htm
Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

De acordo com a tabela acima, se quisermos armazenar este carácter usando o formato 'UTF-8', precisamos de prefixar o nosso carácter com alguns 'headers'. Nosso personagem chinês tem 16 bits de comprimento (conte o valor binário você mesmo), então vamos usar o formato na linha 3 como ele fornece o suficiente espaço:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

Escrever o resultado numa linha:

11100110 10110001 10001001

Este é o valor UTF-8 (binário) do carácter chinês! (confirme você mesmo: http://www.fileformat.info/info/unicode/char/6c49/index.htm)

Resumo

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001
 163
Author: Cheng, 2015-02-25 05:52:52

Eles não são a mesma coisa - UTF-8 é uma forma particular de codificar Unicode.

Existem muitas codificações diferentes das quais pode escolher, dependendo da sua aplicação e dos dados que pretende usar. Os mais comuns são UTF-8, UTF-16 e UTF-32 s, tanto quanto sei.

 104
Author: Greg, 2009-03-13 17:09:23

Unicode define apenas pontos de código , Isto é, um número que representa um carácter. A forma como guarda estes pontos de código na memória depende da codificação que está a usar. UTF-8 é uma forma de codificar caracteres Unicode, entre muitos outros.

 56
Author: Martin Cote, 2009-03-13 17:14:36

Unicode é um padrão que define, juntamente com a norma ISO/IEC 10646, Universal character Set (UCS) que é um superconjunto de todos os caracteres necessários para representar praticamente todas as línguas conhecidas.

Unicode atribui um nome e um número ( Código de caracteres , ou Ponto de código ) a cada carácter no seu repertório.

Codificação UTF-8, é uma forma de representar estes caracteres digitalmente na memória do computador. UTF-8 mapeia cada ponto de código numa sequência de octetos (bytes de 8 bits)

Por exemplo,

Carácter UCS = carácter Unicode Han

Ponto de código UCS = U+24B62

UTF-8 encoding = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (bin)

 26
Author: nightlytrails, 2014-09-27 00:30:49

Unicode é apenas um padrão que define um conjunto de caracteres (UCS) e codificações (UTF) para codificar este conjunto de caracteres. Mas em geral, Unicode é referido ao conjunto de caracteres e não ao padrão.

Leia O mínimo absoluto cada programador de Software absolutamente, positivamente deve saber sobre Unicode e conjuntos de caracteres (sem desculpas!) e Unicode em 5 minutos .

 23
Author: Gumbo, 2009-03-13 17:37:07

As respostas existentes já explicam muitos detalhes, mas aqui está uma resposta muito curta com a explicação mais direta e exemplo.

Unicode é o Padrão que mapeia caracteres para pontos de código.
Cada caractere tem um codepoint único (número de identificação), que é um número como 9731.

UTF-8 é um o codificação dos pontos de código.
Para armazenar todos os caracteres no disco (num ficheiro), o UTF-8 divide caracteres em até 4 octetos (sequências de 8 bits)-bytes. UTF-8 é uma das várias codificações (métodos de representar dados). Por exemplo, em Unicode, o (decimal) codeponto 9731 representa um boneco de neve (), que consiste de 3 bytes em UTF-8: E2 98 83

Aqui está uma lista ordenada com alguns exemplos aleatórios.

 19
Author: basic6, 2017-05-23 11:55:19

1. Unicode

Há muitas personagens em todo o mundo, como"$,&, h, A, t,?,张,1,=,+...". Depois vem uma organização dedicada a estes personagens. Fizeram um padrão chamado "Unicode".

O padrão é o seguinte:

  • crie uma forma na qual cada posição seja chamada de "ponto de código",ou"posição de código".
  • Todas as posições são de U + 0000 A U + 10FFFF;
  • Até agora, algumas posições estão preenchidas com os caracteres e outras posições são guardados ou vazios.
  • por exemplo, a posição "U+0024" é preenchida com o carácter "$".
PS: é claro que há outra organização chamada ISO mantendo outro padrão -- "ISO 10646" ,quase o mesmo.

2. UTF-8

Como acima, U + 0024 é apenas uma posição, então não podemos salvar " U+0024 "no computador para o personagem"$".

Deve haver um método de codificação.

Depois vêm os métodos de codificação, tais como UTF-8, UTF-16, UTF-32, UCS-2....

Em UTF-8, o ponto de código "U+0024" está codificado em 00100100.

00100100 é o valor que guardamos no computador por"$".
 13
Author: wengeezhang, 2017-09-26 05:06:04

Eu verifiquei os links na resposta do Gumbo, e eu queria colar uma parte dessas coisas aqui para existir no fluxo de pilha também.

"...Algumas pessoas estão sob o equívoco de que Unicode é simplesmente um código de 16 bits onde cada personagem leva 16 bits e, portanto, há 65.536 caracteres possíveis. Isto não é, na verdade, correcto. É o único mito mais comum sobre Unicode, então se você pensou isso, não se sinta mal.

Na verdade, o Unicode tem uma forma diferente de pensar em personagens, e você tem que entender a maneira Unicode de pensar das coisas ou nada fará sentido. Até agora, assumimos que uma carta mapeia alguns bits que você pode armazenar em {[[2]}
 12
Author: ,