O padrão Unicode tem pontos de código suficientes para que você precise de 4 bytes para armazenar todos eles. É isso que a codificação UTF-32 faz. Ainda assim, a codificação UTF-8 de alguma forma os espreme em espaços muito menores usando algo chamado "codificação de largura variável".
Na verdade, ele consegue representar os primeiros 127 caracteres de US-ASCII em apenas um byte que se parece exatamente com ASCII real, então você pode interpretar muito texto ASCII como se fosse UTF-8 sem fazer nada a ele. Belo truque. Então, como isso funciona?
Vou fazer e responder minha própria pergunta aqui porque acabei de ler um pouco para descobrir e pensei que poderia economizar algum tempo para outra pessoa. Além disso, talvez alguém possa me corrigir se eu errar em alguma parte.
fonte
Respostas:
Cada byte começa com alguns bits que indicam se é um ponto de código de byte único, um ponto de código de vários bytes ou uma continuação de um ponto de código de vários bytes. Como isso:
Cada um dos pontos de código multibyte começa com alguns bits que essencialmente dizem "ei, você também precisa ler o próximo byte (ou dois ou três) para descobrir o que eu sou." Eles são:
Por fim, todos os bytes que seguem esses códigos iniciais se parecem com isto:
Como você pode dizer para que tipo de byte está olhando desde os primeiros bits, mesmo que algo seja mutilado em algum lugar, você não perde a sequência inteira.
fonte
next char is continuation
? Se tivéssemos um caractere de 3 bytes, seria como:,1xxxxxxx 1xxxxxxx 0xxxxxxx
portanto, menos espaço seria desperdiçado.RFC3629 - UTF-8, um formato de transformação da ISO 10646 é a autoridade final aqui e tem todas as explicações.
Em suma, vários bits em cada byte da sequência de 1 a 4 bytes codificada em UTF-8 que representa um único caractere são usados para indicar se é um byte à direita, um byte à esquerda e, em caso afirmativo, quantos bytes seguem. Os bits restantes contêm a carga útil.
fonte
Trecho do Mínimo Absoluto Todo Desenvolvedor de Software Absolutamente, Positivamente Deve Saber Sobre Unicode e Conjuntos de Caracteres (Sem Desculpas!)
fonte