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


504

Eu ouvi opiniões conflitantes de pessoas - de acordo com a página UTF-8 da Wikipedia .

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


1
O que este WIKI escreve sobre unicode e UTFs está bem na minha opinião. Alguns comentários são estranhos: "É possível no UTF-8 (ou em qualquer outra codificação de vários bytes) dividir ou truncar uma string no meio de um caractere, o que pode resultar em uma string inválida." Portanto, uma sequência que é codificada em UTF-8 não é mais uma sequência, mas uma matriz de bytes ou fluxo de bytes. Os caracteres que compõem a cadeia são codificados. Claro que também pode ser decodificado. Agora é claro que você pode cortar uma sequência utf-8 após o byte de início ou após o byte seguinte, mas por que alguém deveria fazer isso?
Brighty

Este artigo sobre tipos de dados de string é educativo: mortoray.com/2013/11/27/the-string-type-is-broken - às vezes, ao trabalhar com strings e seus componentes no nível de bytes, você pode inadvertidamente cortar um caractere ao meio .
Everett

Respostas:


495

Para expandir as respostas que outras pessoas deram:

Temos muitos idiomas com muitos caracteres que os computadores devem exibir idealmente. Unicode atribui a cada caractere um número único ou ponto de código.

Os computadores lidam com números como bytes ... pulando um pouco da história aqui e ignorando os problemas de memória, os computadores de 8 bits tratam um byte de 8 bits como a maior unidade numérica facilmente representada no hardware, os computadores de 16 bits se expandem isso para dois bytes, e assim por diante.

As codificações de caracteres antigas, como ASCII, são da era (pré) de 8 bits e tentam compactar o idioma dominante na computação da época, ou seja, o inglês, em números que variam de 0 a 127 (7 bits). Com 26 letras no alfabeto, tanto em maiúsculas quanto em maiúsculas, números e sinais de pontuação, funcionou muito bem. O ASCII foi estendido em um oitavo bit para outros idiomas que não o inglês, mas os 128 números / pontos de código adicionais disponibilizados por essa expansão seriam mapeados para caracteres diferentes, dependendo do idioma exibido. Os padrões ISO-8859 são as formas mais comuns desse mapeamento; ISO-8859-1 e ISO-8859-15 (também conhecidas como ISO-Latin-1, latin1 e sim, existem duas versões diferentes do padrão ISO 8859 também).

Mas isso não é suficiente quando você deseja representar caracteres de mais de um idioma, portanto, agrupar todos os caracteres disponíveis em um único byte simplesmente não funcionará.

Existem essencialmente dois tipos diferentes de codificação: um expande a faixa de valores adicionando mais bits. Exemplos dessas codificações seriam UCS2 (2 bytes = 16 bits) e UCS4 (4 bytes = 32 bits). Eles sofrem inerentemente do mesmo problema que os padrões ASCII e ISO-8859, pois sua faixa de valor ainda é limitada, mesmo que o limite seja muito maior.

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

As codificações de vários bytes (devo dizer várias unidades 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 eles precisam decodificar os caracteres para o código unicode pontos antes que essas operações possam ser executadas (existem alguns atalhos).

Os padrões UCS e UTF codificam os pontos de código conforme definido em Unicode. Em teoria, essas codificações poderiam ser usadas para codificar qualquer número (dentro do intervalo que a codificação suporta) - mas é claro que essas codificações foram feitas para codificar pontos de código Unicode. E esse é o seu relacionamento entre eles.

O Windows manipula as chamadas seqüências de caracteres "Unicode" como UTF-16, enquanto a maioria dos UNIXes usa como padrão o UTF-8 atualmente. Protocolos de comunicação como HTTP tendem a funcionar melhor com UTF-8, pois o tamanho da unidade em UTF-8 é o mesmo que em ASCII, e a maioria desses protocolos foi projetada na era ASCII. Por outro lado, o UTF-16 oferece o melhor desempenho médio de espaço / processamento ao representar todos os idiomas ativos.

O padrão Unicode define menos pontos de código do que pode ser representado em 32 bits. Portanto, para todos os fins práticos, UTF-32 e UCS4 se tornaram a mesma codificação, pois é improvável que você precise lidar com caracteres de várias unidades em UTF-32.

Espero que preencha alguns detalhes.


9
Conceitualmente, UCS-2 e UCS-4 são conjuntos de caracteres , não codificações de caracteres (daí o nome).
Caracol mecânico

74
@Tuukka Os erros nesta publicação são uma legião. Existem mais de apenas duas versões da ISO 8859. O ASCII não funcionou para o inglês, faltando coisas como aspas, sinais de centavo, acentos e muito mais - o Unicode não é apenas inglês; O inglês também precisa !! Nenhum ponto de código ocupa mais de 4 bytes em QUALQUER codificação; esse negócio de 6 bytes é totalmente errado. Você não pode codificar em UTF nenhum valor escalar Unicode, como diz: substitutos e os outros 66 não caracteres são proibidos. UCS-4 e UTF-32 não são os mesmos. Não há UTF-32 com várias unidades. UTF-16 não é tão eficiente quanto eles pretendem - & c & c & c!
tchrist

1
O ASCII também não contém o sinal de libra £ e, é claro, não contém o sinal de euro € (que é consideravelmente mais novo que o ASCII).
TRIG

1
@tchrist Parece que 6 bytes não são improváveis, afinal. Veja isto: joelonsoftware.com/articles/Unicode.html, que indica que existe um espaço de caracteres de 0x04000000até 0x7FFFFFFF, ou em binário, é 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv - e são de fato 6 bytes. No entanto, 6 bytes É o máximo e não como o artigo afirma confundidamente "seis bytes ou mais ".
syntaxerror 26/09/14

12
@syntaxerror: "Somente os pontos de código 128 e acima são armazenados usando 2, 3, de fato, até 6 bytes." era preciso quando escrito, mas mais tarde naquele mesmo ano (doze anos atrás) foi invalidado. en.wikipedia.org/wiki/UTF-8 diz "A especificação original abrangia números de até 31 bits (o limite original do Universal Character Set). Em novembro de 2003, o UTF-8 foi restringido pelo RFC 3629 para terminar em U + 10FFFF, para corresponder às restrições da codificação de caracteres UTF-16. Isso removeu todas as sequências de 5 e 6 bytes e cerca de metade das sequências de 4 bytes. "
precisa

237

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 mágico até agora, é muito simples. Agora, digamos que decidimos armazenar esse personagem em nosso disco rígido. Para fazer isso, precisamos armazenar o caractere em formato binário. Podemos simplesmente armazená-lo como está '01101100 01001001'. Feito!

Mas espere um minuto, '01101100 01001001' é um ou dois caracteres? Você sabia que esse é um personagem porque eu lhe disse, mas quando um computador lê, ele não faz ideia. Portanto, precisamos de algum tipo de "codificação" para dizer ao computador para tratá-lo como um.

É aqui que as regras do 'UTF-8' entram: 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 queremos armazenar esse caractere usando o formato 'UTF-8', precisamos prefixar nosso caractere com alguns 'cabeçalhos'. Nosso caractere chinês tem 16 bits (conte o valor binário), portanto, usaremos o formato na linha 3, pois ele fornece 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 caractere chinês! (confirme você mesmo: http://www.fileformat.info/info/unicode/char/6c49/index.htm )

Sumário

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

PS Se você quiser aprender este tópico em python, clique aqui


6
"Mas espere um minuto, '01101100 01001001' é um ou dois caracteres? Você sabia que esse é um caractere porque eu lhe disse, mas quando um computador lê, ele não faz ideia. Então, precisamos de algum tipo de" codificação "para diga ao computador para tratá-lo como um. " Bem, ok, mas o computador ainda não sabe que deve codificá-lo com utf-8?
Koray Tugay

15
@KorayTugay O computador não sabe qual codificação deve usar. Você deve informar quando salvar um caractere em um arquivo e também quando ler um caractere de um arquivo.
Cheng

3
@Connor O computador não sabe qual formato usar. Quando você salva o documento, o editor de texto deve definir explicitamente sua codificação para utf-8 ou qualquer formato que o usuário queira usar. Além disso, quando um programa editor de texto lê um arquivo, ele precisa selecionar um esquema de codificação de texto para decodificá-lo corretamente. O mesmo acontece quando você está digitando e digitando uma letra, o editor de texto precisa saber qual esquema você usa para salvá-lo corretamente.
Cheng

2
Então, como esses cabeçalhos são interpretados? Se eu olhar para a primeira tabela, penso: se o byte começa com bit 0, o caractere é representado por 1 mordida (a atual), se o byte começa com 110, o caractere é representado por 2 bytes (o atual e o próximo ( bits restantes depois 10)), se o byte começar com 1110, o caractere será representado por 3 bytes, o atual e os próximos 2 bytes (bits restantes depois 10).
JBoy

2
Leia 10 artigos sobre UTF-8; depois de ler este eu entendi dentro de 10 segundos :)
jrhee17

201

Infelizmente, o "Unicode" é 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 caracteres e os pontos de código inteiro que os representam.

UTF-8 é uma codificação de caracteres - uma maneira de converter de sequências de bytes para sequências de caracteres e vice-versa. Abrange todo o conjunto de caracteres Unicode. O ASCII é codificado como um byte único por caractere, e outros caracteres levam mais bytes, dependendo do ponto de código exato (até 4 bytes para todos os pontos de código definidos atualmente, ou seja, até U-0010FFFF, e de fato 4 bytes podem lidar com até U-001FFFFF).

Quando "Unicode" é usado como o nome de uma codificação de caracteres (por exemplo, a propriedade .NET Encoding.Unicode ), geralmente significa UTF-16 , que codifica os caracteres mais comuns como dois bytes. Algumas plataformas (principalmente .NET e Java) usam UTF-16 como sua codificação de caracteres "nativa". Isso leva a problemas complicados se você precisar se preocupar com caracteres 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 preocupa com isso, IME.

Algumas referências no Unicode:


16
Eu acho que UTF-16 é igual a "Unicode" nas plataformas Windows. As pessoas tendem a usar UTF-8 por padrão no * nix. +1, porém, boa resposta
jalf 13/03/2009

10
@ Chris: Não, a ISO-8859-1 não é UTF-8. UTF-8 codifica U + 0080 para U + 00FF como dois bytes, não um. O Windows 1252 e o ISO-8859-1 são basicamente os mesmos, mas diferem entre os valores 0x80 e 0x99, se bem me lembro, onde o ISO 8859-1 tem um "furo", mas o CP1252 define caracteres.
31909 Jon Skeet

13
A idéia de chamar UTF-16 de "Unicode" fica desconfortável comigo, devido ao seu potencial de confusão - mesmo que isso tenha sido claramente indicado apenas como uma convenção do .NET. UTF-16 é uma maneira de representar Unicode, mas não é "A codificação Unicode".
thomasrutter

6
@unwesen: O UTF-8 não precisa de pares substitutos. Representa apenas caracteres não-BMP usando sequências de bytes progressivamente mais longas.
Jon Skeet

5
@RoyiNamir: Sim, infelizmente, "Unicode" costuma ser usado como "UTF-16", principalmente no Windows.
Jon Skeet

108

Eles não são a mesma coisa - o UTF-8 é uma maneira específica de codificar Unicode.

Você pode escolher entre várias codificações diferentes, dependendo do aplicativo e dos dados que pretende usar. Os mais comuns são UTF-8, UTF-16 e UTF-32 s, até onde eu sei.


10
no entanto, o ponto é que alguns editores propõem salvar o arquivo como "Unicode" OU "UTF-8". Portanto, a menção sobre esse "Unicode" nesse caso é UTF-16, que eu acredito necessário.
serhio 27/07/10

71

Unicode define apenas pontos de código , ou seja, um número que representa um caractere. Como você armazena esses pontos de código na memória depende da codificação que você está usando. UTF-8 é uma maneira de codificar caracteres Unicode, entre muitos outros.


2
no entanto, o ponto é que alguns editores propõem salvar o arquivo como "Unicode" OU "UTF-8". Portanto, a menção sobre esse "Unicode" nesse caso é UTF-16, que eu acredito necessário.
serhio 27/07/10

Um número, que apresenta um caractere, também executa ASCII.
Brighty

6
leia isso antes e depois de examinar o restante das respostas nesta página
Dodgie

33

Unicode é um padrão que define, juntamente com o ISO / IEC 10646, Universal Character Set (UCS), que é um superconjunto de todos os caracteres existentes necessários para representar praticamente todos os idiomas conhecidos.

O Unicode atribui um nome e um número ( código de caractere ou ponto de código ) a cada caractere em seu repertório.

A codificação UTF-8 é uma maneira de representar esses caracteres digitalmente na memória do computador. UTF-8 mapeia cada ponto de código em uma sequência de octetos (bytes de 8 bits)

Por exemplo,

Caractere UCS = Caractere Han Unicode

Ponto de código UCS = U + 24B62

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


Não, o UTF-8 mapeia apenas pontos de código em uma sequência maior que 127. Tudo de 0 a 127 não é uma sequência, mas um único byte. Por outro lado, o ASCII também atribui o nome de um caractere a um número, portanto é o mesmo que o Unicode. Mas o Unicode não para no ponto de código 127, mas sobe para 0x10ffff.
Brighty

2
@brightly eu diferir. Os caracteres ASCII são de fato mapeados para uma sequência de bytes simples. O primeiro bit, que é 0 no caso de código para caracteres ascii, indica quantos bytes seguem - zero. http://www.wikiwand.com/en/UTF-8#/DescriptionDê uma olhada na primeira linha.
nightlytrails

Bem, para mim, uma sequência consiste em mais de um byte. Um caractere ASCII dentro de UTF-8 é um byte único, com o bit mais significativo definido como 0. Pontos de código maiores que 127 precisam de sequências, que sempre têm um startbyte e um, dois ou três bytes seguintes. Então, por que você chamaria um único byte de "sequência"?
Brighty

Bem ... Muitas vezes, os advogados do idioma inglês podem ficar confusos com o uso indevido intencional de software. É o mesmo caso aqui. Você pode discutir sobre isso. Mas isso não tornará mais claro.
nightlytrails

1
@brighty Hmmm, em matemática, uma sequência de 0 elementos está OK. Uma sequência de 1 elemento também é boa aqui.
chux - Restabelece Monica

24

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 ao conjunto de caracteres e não ao padrão.

Leia o mínimo absoluto que todo desenvolvedor de software deve saber absolutamente, positivamente sobre Unicode e conjuntos de caracteres (sem desculpas!) E Unicode em 5 minutos .


1
@serhio: Eu sei. Embora existam três codificações UTF-16 diferentes: As duas UTF-16LE e UTF-16BE explícitas e a UTF-16 implícita em que a endianness é especificada com uma BOM.
Gumbo

@ Gumbo: A falta de uma lista técnica não significa que é uma codificação diferente. Existem apenas duas codificações.
Mooing Duck

O blog acima foi escrito pelo CEO da Stakcoverflow.
Shailesh Pratapwar

23

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

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

UTF-8 é a codificação dos pontos de código.
Para armazenar todos os caracteres no disco (em um arquivo), o UTF-8 divide os 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 ponto de código (decimal) 9731 representa um boneco de neve ( ), que consiste em 3 bytes em UTF-8:E2 98 83

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


1
Não! UTF-8 é uma ótima maneira de codificar caracteres unicode, mas também podemos codificar em UTF-16 ou UTF-32. Com o UTF-32, temos uma relação 1: 1 entre DWORD e ponto de código, com UTF-16, temos uma relação 1: 1 entre WORD e ponto de código apenas para pontos de código do BMP, excluindo os substitutos e as listas técnicas. Em UTF-8 nós temos uma relação 1: 1 entre byte e codepoint apenas para codepoints <127.
Brighty

5
@brighty: Certo, mas por que "Não!"? Escrevi "UTF-8 é uma das várias codificações" porque também existem UTF-16 e UTF-32.
basic6

16

1. Unicode

Existem muitos personagens em todo o mundo, como "$, &, h, a, t,?, 张, 1, =, + ...".

Depois, chega uma organização dedicada a esses personagens,

Eles criaram um padrão chamado "Unicode".

O padrão é o seguinte:

  • crie um formulário no qual cada posição seja chamada "ponto de código" ou "posição do código".
  • As posições inteiras são de U + 0000 a U + 10FFFF;
  • Até agora, algumas posições são preenchidas com caracteres e outras são salvas ou vazias.
  • Por exemplo, a posição "U + 0024" é preenchida com o caractere "$".

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, portanto não podemos salvar "U + 0024" no computador para o caractere "$".

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

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

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

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


1
Em geral, o UTF-8 é a única variante usada atualmente.
Rick James

2
ISO 10646 é um padrão idêntico ao conjunto de caracteres Unicode. O Unicode define muitas outras coisas além do conjunto de caracteres, como regras para classificação, casos, etc. ISO 10646 é apenas o conjunto de caracteres (dos quais existem atualmente mais de 130.000). O Unicode Consortium e o ISO desenvolvem o Unicode em conjunto, com o ISO preocupado apenas com o conjunto de caracteres e suas codificações, e o Unicode também define propriedades e regras de caracteres para o processamento de texto.
thomasrutter

12

Eu verifiquei os links na resposta do Gumbo e queria colar parte dessas coisas aqui para existir também no Stack Overflow.

"... Algumas pessoas estão erradas no conceito de que Unicode é simplesmente um código de 16 bits, em que cada caractere ocupa 16 bits e, portanto, existem 65.536 caracteres possíveis. Na verdade, isso não está correto. É o mito mais comum sobre Unicode. , se você pensou assim, não se sinta mal.

De fato, o Unicode tem uma maneira diferente de pensar sobre os personagens, e você precisa entender a maneira como as coisas são pensadas ou nada fará sentido.

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

A -> 0100 0001

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

"... Cada letra platônica de cada alfabeto recebe um número mágico do consórcio Unicode, que é escrito assim: U + 0639. Esse número mágico é chamado de ponto de código. O U + significa" Unicode "e os números são hexadecimais. U + 0639 é a letra árabe Ain. A letra em inglês A seria U + 0041 .... "

"... OK, digamos 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.

Apenas um monte de pontos de código. Números, realmente. Ainda não dissemos nada sobre como armazenar isso na memória ou representá-lo em uma mensagem de e-mail ... "

"... É aí que entram as codificações.

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

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

Direita? Não tão rápido! Também não poderia ser:

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


No ASCII, uma carta também é mapeada para um ponto de código, não apenas no unicode.
Brighty

8

UTF-8 é um esquema de codificação possível para texto Unicode .

Unicode é um padrão de escopo amplo que define mais de 130.000 caracteres e atribui a cada um código numérico (um ponto de código). Ele também define regras de como classificar este texto, normalizá-lo, alterar seu caso e muito mais. Um caractere no Unicode é representado por um ponto de código de zero a 0x10FFFF, inclusive, embora alguns pontos de código sejam reservados e não possam ser usados ​​para caracteres.

Há mais de uma maneira em que uma sequência de pontos de código Unicode pode ser codificada em um fluxo binário. Estes são chamados de "codificações". A codificação mais direta é UTF-32 , que simplesmente armazena cada ponto de código como um número inteiro de 32 bits, cada um com 4 bytes de largura.

O UTF-8 é outra codificação e está se tornando o padrão de fato, devido a várias vantagens sobre o UTF-32 e outras. UTF-8 codifica como uma sequência de valores de byte único. Cada ponto de código pode usar um número variável desses valores de bytes. Os pontos de código no intervalo ASCII são codificados, para serem compatíveis com o ASCII. Os pontos de código fora desse intervalo usam um número variável de bytes, 2, 3 ou 4, dependendo do intervalo em que estão.

O UTF-8 foi projetado com estas propriedades em mente:

  • Os caracteres ASCII são codificados exatamente como no ASCII, de modo que uma sequência ASCII também seja uma sequência UTF-8 válida.

  • Classificação binária: a classificação de cadeias UTF-8 usando uma classificação binária ingênua ainda resultará na classificação de todos os pontos de código em ordem numérica.

  • Os caracteres que requerem vários bytes não contêm valores de bytes no intervalo ASCII, garantindo que parte deles não possa ser confundida com caracteres ASCII. Esse também é um recurso de segurança.

  • O UTF-8 pode ser facilmente validado e diferenciado de outras codificações de caracteres por um validador. O texto em outras codificações de 8 bits ou de vários bytes muito raramente será validado como UTF-8.

  • Acesso aleatório: Em qualquer ponto da string UTF-8, é possível saber se o byte nessa posição é o primeiro byte de um caractere ou não, e encontrar o início do caractere seguinte ou atual, sem precisar avançar. ou mais de alguns bytes para trás ou leia qualquer coisa no início do fluxo.


Alguns pontos menores: [1] "Os caracteres ASCII não são codificados exatamente como estão em ASCII " devem ser alterados para "Os caracteres ASCII são codificados exatamente como em UTF-8 " ? [2] A frase "Os códigos em Unicode ..." não é clara (para mim). Você quer dizer "pontos de código Unicode ..." ?
Skomisa

@skomisa para o ponto 1, quis dizer que a codificação de caracteres dentro do intervalo ASCII é idêntica para ASCII e UTF-8.
thomasrutter

Para o ponto 2, que é um ponto justo e eu vou editar que para torná-lo mais claro
thomasrutter

2

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

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


Acho que a primeira frase da página da Wikipedia que você mencionou fornece um resumo breve e agradável:

UTF-8 é uma codificação de caracteres de largura variável capaz de codificar todos os 1.112.064 pontos de código válidos no Unicode usando um a quatro bytes de 8 bits.

Para elaborar:

  • Unicode é um padrão, que define um mapa de caracteres para 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 de codificar esses pontos de código de uma forma que um computador possa entender, também conhecido como bits . Em outras palavras, é uma maneira / algoritmo de converter cada um desses pontos de código em uma sequência de bits ou converter uma sequência de bits em pontos de código equivalentes. Observe que existem muitas codificações alternativas para Unicode.


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


2

Se eu puder resumir o que reuni neste tópico:

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

à = 224

UTF-8 é uma codificação que 'converte' esses números em representações binárias .

224 = 11000011 10100000

Observe que estamos falando da representação binária de 224, não de sua forma binária, que é 0b11100000.


2

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

ESCREVER PARA AMORTECEDOR

se você gravar em um buffer de 4 bytes, símbolo com codificação UTF8, seu binário ficará assim:

00000000 11100011 10000001 10000010

se você gravar em um buffer de 4 bytes, símbolo com codificação UTF16, seu binário ficará assim:

00000000 00000000 00110000 01000010

Como você pode ver, dependendo do idioma que você usaria no seu conteúdo, isso afetará sua memória de acordo.

Por exemplo, para este símbolo em particular: a codificação UTF16 é mais eficiente, pois temos 2 bytes sobressalentes para usar no próximo símbolo. Mas isso não significa que você deve usar o UTF16 para o alfabeto japonês.

LEITURA DO BUFFER

Agora, se você quiser ler os bytes acima, precisará saber em qual codificação foi gravada e decodificá-la novamente.

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 exclusivo. por exemplo, o símbolo (letra) possui um (ponto de código) : 30 42 (hex). A codificação, por outro lado, é um algoritmo que converte símbolos de maneira mais apropriada ao armazenar em 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.

insira a descrição da imagem aqui


artigo vinculado muito bom, espero que continue ativo
yolob 21 de

0

UTF-8 é um método para codificar caracteres Unicode usando sequências de 8 bits.

Unicode é um padrão para representar uma grande variedade de caracteres de vários idiomas.


4
"Sequências de 8 bits" ...? Pode querer especificar isso de maneira mais precisa…
deceze
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.