34 pontos por GN⁺ 2025-09-13 | Ainda não há comentários. | Compartilhar no WhatsApp
  • UTF-8 é um método de codificação de comprimento variável que representa milhões de caracteres mantendo a compatibilidade retroativa com ASCII
  • A mesma faixa de 7 bits do ASCII (U+0000~U+007F) usa 1 byte sem alteração, então um arquivo ASCII já é um arquivo UTF-8 válido
  • Os demais caracteres são representados em sequências de 2 a 4 bytes, e o padrão de bits do byte inicial define o comprimento, enquanto os bytes seguintes começam com 10 para indicar que são bytes de continuação
  • Graças a esse design, o UTF-8 lida com um conjunto universal de caracteres e ao mesmo tempo é totalmente compatível com sistemas ASCII existentes, tornando-se a codificação de caracteres mais usada
  • Outras codificações Unicode, como UTF-16 e UTF-32, não oferecem essa compatibilidade com ASCII

A excelência do design do UTF-8

  • Quando tive meu primeiro contato com a codificação UTF-8, fiquei muito impressionado com a estrutura compatível com o ASCII existente enquanto ela abrange milhões de caracteres de diferentes idiomas e sistemas de escrita em um único esquema
  • Em essência, o UTF-8 utiliza até 32 bits, mas o ASCII usa apenas 7 bits
  • Os princípios de design do UTF-8 são os seguintes
    • Todo arquivo codificado em ASCII é um arquivo UTF-8 válido
    • Todo arquivo UTF-8 que contenha apenas caracteres ASCII é um arquivo ASCII válido
  • A ideia de integrar um sistema antigo limitado a apenas 128 caracteres com um esquema que abrange milhões de caracteres é extremamente inovadora

Conceito básico do UTF-8

  • UTF-8 é uma codificação de caracteres de comprimento variável (variable-width encoding) projetada para representar todos os caracteres do conjunto de caracteres Unicode
  • Cada caractere é codificado em 1 a 4 bytes
  • Os primeiros 128 caracteres (U+0000~U+007F) são armazenados em um único byte, garantindo compatibilidade retroativa com ASCII
  • Os demais caracteres são codificados em dois, três ou quatro bytes
  • Os bits iniciais do primeiro byte determinam o número total de bytes necessário para a codificação
Padrão de 1 byte Número de bytes Padrão da sequência completa de bytes
0xxxxxxx 1 0xxxxxxx (ASCII comum)
110xxxxx 2 110xxxxx 10xxxxxx
1110xxxx 3 1110xxxx 10xxxxxx 10xxxxxx
11110xxx 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • O 2º, 3º e 4º bytes das sequências multibyte sempre começam com 10, o que marca claramente que são bytes de continuação
  • Ao combinar os bits restantes do byte principal e dos bytes de continuação, forma-se um code point
    • Um code point é um identificador único de caractere Unicode, expresso com o prefixo "U+" e em hexadecimal
    • Ex.: o code point de "A" é U+0041
  • O fluxo para interpretar um caractere a partir dos bytes codificados em UTF-8 é o seguinte
    • 1. Leia o byte; se ele começar com 0, trate-o como um caractere de um único byte (ASCII), use os 7 bits restantes para representar o caractere e avance para o próximo byte
    • 2. Se não começar com 0, então
      • Se for 110, leia mais um byte para formar um caractere de 2 bytes
      • Se for 1110, leia os próximos 2 bytes para formar um caractere de 3 bytes
      • Se for 11110, leia mais 3 bytes para formar um caractere de 4 bytes
    • 3. Nos bytes determinados, combine os bits restantes, excluindo os bits iniciais, e use o resultado como o valor binário do code point
    • 4. Encontre o code point no conjunto de caracteres Unicode e exiba-o na tela
    • 5. Repita com o próximo byte

Exemplo: o caractere em hindi "अ"

  • Representação em UTF-8: 11100000 10100100 10000101 (3 bytes)
  • Primeiro byte (11100000) → indica que é um caractere de 3 bytes
  • Combinação dos bits válidos dos três bytes → 00001001 00000101 = hexadecimal 0x0905
  • O code point U+0905 representa o caractere devanágari "अ"

Exemplos de arquivo

  • 1. Hey👋 Buddy

    • Composto por 13 bytes no total
      • Caracteres ASCII (H, e, y, B, u, d, d, y, espaço) → 1 byte cada
      • 👋 (U+1F44B) → 4 bytes 11110000 10011111 10010001 10001011
    • Este arquivo é um arquivo UTF-8 válido, mas como contém um caractere não ASCII (emoji), não é retrocompatível com ASCII
  • 2. Hey Buddy

    • Total de 9 bytes, todos dentro da faixa ASCII
    • Portanto, este arquivo é ao mesmo tempo um arquivo ASCII válido e um arquivo UTF-8 válido

Comparação com outras codificações

  • Existem algumas codificações que oferecem compatibilidade com ASCII, mas não são tão usadas quanto o UTF-8
  • GB18030 (padrão chinês) etc. também oferecem compatibilidade com ASCII, mas não são amplamente usados
  • A família ISO/IEC 8859 é uma extensão de byte único (máximo de 256 caracteres), portanto tem limitações
  • UTF-16/UTF-32 não têm compatibilidade com ASCII
    • 'A' (U+0041): em UTF-16 é 00 41, em UTF-32 é 00 00 00 41

Bônus: UTF-8 Playground

Ainda não há comentários.

Ainda não há comentários.