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?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.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:
- the Unicode consortium web site and in particular the tutorials section
- artigo do Joel
- o meu próprio artigo (. Net-oriented)
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
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.
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.
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)
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 .
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.
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 "$".
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"$".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]}