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

votos
363

Tenho ouvido opiniões conflitantes de pessoas - de acordo com a Wikipedia, veja aqui .

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

Publicado 13/03/2009 em 18:06
fonte usuário
Em outras línguas...                            


15 respostas

votos
102

Eles não são a mesma coisa - UTF-8 é um modo particular de codificação Unicode.

Há muitas codificações diferentes que você pode escolher, dependendo da sua aplicação e os dados que você pretende usar. Os mais comuns são UTF-8, UTF-16 e UTF-32 s tanto quanto eu sei.

Respondeu 13/03/2009 em 18:09
fonte usuário

votos
174

"Unicode" é um infelizmente usado de várias maneiras diferentes, dependendo do contexto. Seu uso mais correto (IMO) é como um conjunto de caracteres codificados - ou seja, um conjunto de caracteres e um mapeamento entre os personagens e inteiro pontos de código representá-los.

UTF-8 é uma codificação de caracteres - uma forma de converter a partir de sequências de bytes de sequências de caracteres e vice-versa. Abrange todo o conjunto de caracteres Unicode. ASCII é codificado como um único byte por caractere, e outros personagens tomar mais bytes, dependendo do seu ponto de código exata (até 4 bytes para todos os pontos de código actualmente definido, ou seja, até U-0010FFFF e, na verdade 4 bytes poderia lidar com até U-001FFFFF).

Quando "Unicode" é utilizado como o nome de uma codificação de caracteres (por exemplo, como o .NET Encoding.Unicode propriedade) que normalmente significa UTF-16 , que codifica os caracteres mais comuns como dois bytes. Algumas plataformas (nomeadamente .NET e Java) usam UTF-16 como sua codificação de caracteres "nativo". Isto leva a Hairy problemas se você precisa se preocupar com caracteres que não podem ser codificados em um único valor UTF-16 (que está codificado como "pares substitutos") - mas a maioria dos desenvolvedores não se preocupam com isso, IME.

Algumas referências sobre Unicode:

Respondeu 13/03/2009 em 18:11
fonte usuário

votos
54

Unicode só definem pontos de código , ou seja, um número que representa um personagem. Como você armazenar esses pontos de código na memória depende da codificação que você está usando. UTF-8 é uma forma de codificação de caracteres Unicode, entre muitos outros.

Respondeu 13/03/2009 em 18:14
fonte usuário

votos
23

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

Leia o desenvolvedor Absolute Minimum cada Software Absolutamente, Positivamente Precisa Saber Sobre Unicode e Conjuntos de caracteres (Sem Desculpas!) E Unicode em 5 minutos .

Respondeu 13/03/2009 em 18:37
fonte usuário

votos
379

Para expandir nas respostas outros têm dado:

Temos muitas línguas com muitos personagens que os computadores devem mostrar idealmente. Unicode atribui a cada personagem um número único, ou ponto de código.

Computadores lidar com tais números como bytes ... pular um pouco de história aqui e ignorando questões de endereçamento de memória, computadores de 8 bits iria tratar um byte de 8 bits como a maior unidade numérica facilmente representados no hardware, computadores de 16 bits iria expandir que a dois bytes, e assim por diante.

codificações de caracteres antigos, como ASCII são da (pré-) 8-bit era, e tentar empinar a língua dominante em 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 na capital e de forma não-capitais, números e sinais de pontuação, que funcionou muito bem. ASCII foi prorrogado por um pouco 8ª para outras línguas, não-inglês, mas os pontos 128 números / de código adicionais disponibilizadas por essa expansão seria mapeados para caracteres diferentes, dependendo do idioma que está sendo exibido. As normas ISO-8859 são as formas mais comuns deste mapeamento; ISO-8859-1 e ISO-8859-15 (também conhecida como ISO-Latina-1, latin1, e sim, existem duas versões diferentes da norma ISO 8859, bem).

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

Existem essencialmente dois tipos diferentes de codificação: um expande a gama de valor por adição de mais bits. Exemplos destes codificações seria 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 sua faixa de valor ainda é limitada, mesmo que o limite é muito mais elevado.

O outro tipo de codificação utiliza um número variável de bytes por carácter, e as codificações mais comumente conhecida para isso são as codificações UTF. Todas as codificações UTF trabalhar em aproximadamente da mesma maneira: você escolhe um tamanho da unidade, que para UTF-8 é de 8 bits, para UTF-16 é de 16 bits, e para UTF-32 é de 32 bits. A norma define, então, alguns desses bits como bandeiras: se eles estão definido, então a próxima unidade em uma seqüência de unidades deve ser considerado parte do mesmo personagem. Se eles não estão definidos, esta unidade representa um personagem totalmente. Assim, os (Inglês) caracteres mais comuns ocupam somente um byte no UTF-8 (dois em UTF-16, 4 em UTF-32), mas outros caracteres de linguagem pode ocupar seis bytes ou mais.

codificações multi-byte (devo dizer multi-unidade após a explicação acima) tem a vantagem de que eles são relativamente eficiente de espaço, mas a desvantagem que as operações tais como encontrar substrings, comparações, etc. todos têm de decodificar os caracteres no código unicode pontos antes de tais operações podem ser executadas (há alguns atalhos, embora).

Ambos os padrões UCS e os padrões de UTF codificar os pontos de código conforme definido no Unicode. Em teoria, essas codificações podem ser utilizadas para codificar qualquer quantidade (dentro da gama da codificação suporta) -, mas é claro que essas codificações foram feitas para codificar pontos de código Unicode. E essa é a sua relação entre eles.

Windows lida com os chamados cordas "Unicode" como UTF-16 cordas, enquanto a maioria dos UNIXes padrão para UTF-8 nos dias de hoje. Comunicações protocolos como HTTP tendem a trabalhar melhor com UTF-8, como o tamanho da unidade em UTF-8 é o mesmo que em ASCII, ea maioria desses protocolos foram projetados na era ASCII. Por outro lado, UTF-16 dá a melhor média desempenho espaço / processamento quando representando todas as línguas vivas.

O padrão Unicode define menos pontos de código que podem ser representados em 32 bits. Assim, para todos os efeitos práticos, UTF-32 e UCS4 tornou-se a mesma codificação, como é improvável que você tem que lidar com caracteres multi-unit em UTF-32.

Esperamos que preenche alguns detalhes.

Respondeu 13/03/2009 em 18:37
fonte usuário

votos
12

Fui verificar as ligações em resposta de Gumbo, e eu queria para colar alguma parte dessas coisas aqui de existir em estouro de pilha também.

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

Na verdade, Unicode tem uma maneira diferente de pensar sobre personagens, e você tem que entender a forma como Unicode de pensar das coisas ou nada vai fazer sentido.

Até agora, temos assumido que uma carta mapeia para alguns bits que você pode armazenar em disco ou na memória:

A -> 0100 0001

Em Unicode, uma carta mapas para algo chamado um ponto de código que ainda é apenas um conceito teórico. Como esse ponto de código é representado na memória ou no disco é uma outra história ..."

" ... Cada letra platônica em cada alfabeto é atribuído um número mágico pelo consórcio Unicode que está escrito assim:. L + 0639 Este número mágico é chamado um ponto de código O U + significa. 'Unicode' e os números são hexadecimal. U + 0639 é a letra árabe Ain. o Inglês letra a seria U + 0041 ...."

" ... OK, então dizer que temos uma string:

Olá

que, em Unicode, corresponde a esses cinco pontos de código:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

Só um monte de pontos de código. Números, realmente. Nós ainda não disse nada sobre como armazenar isto em memória ou representá-lo em uma mensagem de e-mail ..."

" ... É aí que codificações entrar.

A idéia mais antiga para a codificação Unicode, o que levou ao mito sobre os dois bytes, era, hey, vamos apenas guardar esses números em dois bytes cada. Então Olá torna-se

00 48 00 65 00 6C 00 6C 00 6F

Certo? Não tão rápido! Não poderia ser também:

48 00 65 00 6C 00 6C 00 6F 00? ..."

Respondeu 30/05/2011 em 10:37
fonte usuário

votos
25

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

Unicode atribui um nome e um número ( Código de caracteres , ou Code-ponto ) para cada personagem em seu repertório.

UTF-8 , é uma forma de representar esses personagens digitalmente na memória do computador. UTF-8 mapeia cada ponto de código para uma sequência de octetos (bytes de 8 bits)

Para, por exemplo,

UCS Character = Unicode Han Character

UCS código de ponto = L + 24B62

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

Respondeu 24/02/2013 em 19:36
fonte usuário

votos
19

As respostas já existentes explicar um monte de detalhes, mas aqui está um curto espaço de resposta com a explicação mais direta e exemplo.

Unicode é o padrão que mapeia caracteres para codepoints.
Cada carácter tem um ponto de código único (número de identificação), que é um número como 9731.

UTF-8 é um a codificação dos pontos de código.
A fim de armazenar todos os caracteres no disco (em um arquivo), 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 representação de dados). Por exemplo, em Unicode, o (decimal) ponto de código 9731 representa um boneco ( ), que é composto por 3 bytes de UTF-8:E2 98 83

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

Respondeu 19/05/2014 em 14:57
fonte usuário

votos
13

1. Unicode

Há estiver muito de personagens ao redor do mundo, como "$, &, h, uma t,?, 张, 1, =, + ...".

Em seguida, vem uma organização que é dedicado a esses personagens,

Eles fizeram um padrão chamado de "Unicode".

O padrão é como segue:

  • criar um formulário em que cada posição é chamado de "ponto de código", ou "posição do código".
  • As posições integrais são a partir de U + 0000 a U + 10FFFF;
  • Até agora, algumas posições são preenchidas com caracteres, e outras posições são salvas ou vazio.
  • Por exemplo, a posição de "U + 0024" é preenchido com o caractere "$".

PS: Claro que há uma outra organização chamada ISO mantendo um outro padrão - "ISO 10646", quase o mesmo.

2. UTF-8

Como acima, U + 0024 é apenas uma posição, por isso não pode salvar "U + 0024" no computador para o caractere "$".

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

Então chegaram métodos de codificação, tais como UTF-8, UTF-16, UTF-32, UCS-2 ....

Sob UTF-8, o ponto de código "L + 0024" é codificado em 00.100.100.

00100100 é o valor que salvar no computador para "$".

Respondeu 05/01/2015 em 09:28
fonte usuário

votos
147

Deixe-me usar um exemplo para ilustrar este tema:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

Nada mágico, até agora, é muito simples. Agora, vamos dizer que decidir armazenar esse caráter em nosso disco rígido. Para isso, é necessário armazenar o personagem em formato binário. Podemos simplesmente armazená-lo como é '01101100 01001001'. Feito!

Mas espere um minuto, é '01101100 01001001' um personagem ou dois personagens? Você sabia que este é um personagem porque eu lhe disse, mas quando um computador lê-lo, ele não tem idéia. Por isso, precisamos de algum tipo de "encoding" para dizer ao computador para tratá-lo como um.

Este é o lugar onde as regras do 'UTF-8' vem em: 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 esse personagem usando o formato do 'UTF-8', precisamos prefixo nosso caráter com alguns 'headers'. Nosso caráter chinês é de 16 bits de comprimento (contar o valor binário você mesmo), por isso vamos usar o formato na linha 3, uma vez que oferece espaço suficiente:

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

Escrevendo o resultado em uma linha:

11100110 10110001 10001001

Este é o valor UTF-8 (binário) do caráter chinês! (confirmar-se: 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
Respondeu 14/01/2015 em 09:07
fonte usuário

votos
1

Unicode é um padrão escopo amplo que define mais de 130.000 caracteres e aloca cada um código numérico (um "ponto de código"). Ele também define regras para como classificar este texto, normalizá-lo, mudar o seu caso, e muito mais. Um personagem em Unicode é representado por um ponto de código de zero até 0x10FFFF inclusive, apesar de alguns pontos de código são reservados e não podem ser usados para caracteres.

Os códigos em Unicode pode ser representado em mais do que uma codificação. O mais simples é UTF-32, que codifica simplesmente o ponto de código como inteiros de 32 bits, sendo cada um com 4 bytes de largura.

UTF-8 é outra codificação, e rapidamente se tornando o padrão de-facto. Ele codifica como uma sequência de valores de byte. Cada ponto de código pode utilizar um número variável de bytes destes. Pontos de código na faixa de ASCII são codificados nua, para ser compatível com ASCII. Pontos de código fora deste intervalo usar um número variável de bytes, ou 2, 3 ou 4, dependendo de qual faixa em que estão.

UTF-8 foi concebido com estas propriedades em mente:

  • caracteres ASCII são codificados exatamente como eles estão em ASCII, de tal forma que uma seqüência de caracteres ASCII é também válido como UTF-8.

  • Binários de classificação: Classificando UTF-8 cordas usando uma classificação binária ingênuo ainda vai resultar em todos os pontos de código a ser classificados em ordem numérica.

  • Caracteres fora do intervalo ASCII não use quaisquer bytes no intervalo ASCII, garantindo que eles não podem ser confundidos com caracteres ASCII. Este também é um recurso de segurança.

  • UTF-8 pode ser facilmente validada, e distinguido de outras codificações de caracteres por um validador. Texto em outras codificações de 8 bits ou multi-byte vai muito raramente também validar como UTF-8.

  • acesso aleatório: Em qualquer ponto na cadeia de caracteres UTF-8 é possível dizer se o byte nessa posição é o primeiro byte de um caractere ou não, e que recuar para o início desse personagem, sem a necessidade de se referir a qualquer coisa o início da string.

Respondeu 26/09/2017 em 05:05
fonte usuário

votos
0

Eles são a mesma coisa, não são?

Não, eles não são.


Eu acho que a primeira frase do página da Wikipedia você referenciou dá um bom, breve resumo:

UTF-8 é uma codificação de caracteres largura variável capaz de codificar todas as 1,112,064 pontos de código válidas em Unicode usando um a quatro bytes de 8-bit.

Para elaborar:

  • Unicode é um padrão, que define um mapa de caracteres de números, os chamados pontos de código , (como no exemplo abaixo). Para o mapeamento completo, você pode dar uma olhada aqui .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 é uma das maneiras para codificar esses pontos de código em um formulário de um computador pode entender, aka pedaços . Em outras palavras, é uma forma / algoritmo para converter cada um desses pontos de código a uma sequência de bits ou converter uma seqüência de bits para os pontos de código equivalentes. Note-se que há uma série de codificações alternativas para Unicode.


Joel dá um muito bom explicação e uma visão geral da história aqui .

Respondeu 11/01/2018 em 19:12
fonte usuário

votos
0

UTF-8 é um método para a codificação de caracteres Unicode usando sequências de 8-bit.

Unicode é um padrão para representar uma grande variedade de personagens de muitas línguas.

Respondeu 26/01/2018 em 13:35
fonte usuário

votos
0

Se eu puder resumir o que eu recolhidas a partir de este tópico:

Unicode 'traduz' caracteres a números ordinais (na forma decimal) .

à = 224

UTF-8 é uma codificação que 'traduz' esses números para binário representações .

224 = 11000011 10100000
Respondeu 18/07/2019 em 10:17
fonte usuário

votos
0

Este artigo explica todos os detalhes http://kunststube.net/encoding/

GRAVAR EM tampão

se você escrever para um buffer de 4 bytes, símbolo com a codificação UTF8, o binário será parecido com este:

00000000 11100011 10000001 10000010

se você escrever para um buffer de 4 bytes, símbolo com codificação UTF16, seu binário será parecido com este:

00000000 00000000 00110000 01000010

Como você pode ver, dependendo do que a linguagem que você usaria em seu conteúdo isso afetará sua memória em conformidade.

eg Para este particular símbolo: codificação UTF16 é mais eficiente uma vez que temos 2 bytes peças a serem usadas para o próximo símbolo. Mas isso não significa que você deve usar UTF16 para o Japão alfabeto.

LEITURA DE TAMPÃO

Agora, se você quiser ler os bytes acima, você tem que saber em qual codificação foi escrito para e decodificá-lo correctamente.

eg Se você decodificar este: 00000000 11100011 10000001 10000010 em codificação UTF16, você vai acabar com não

Nota: Codificação e Unicode são duas coisas diferentes. Unicode é o grande (tabela) com cada símbolo mapeado para um ponto de código único. por exemplo símbolo (carta) tem uma (ponto de código) : 30 42 (hex). Codificação por outro lado, é um algoritmo que converte símbolos a forma mais adequada, ao armazenar a hardware.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

digite descrição da imagem aqui

Respondeu 12/10/2019 em 07:30
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more