- 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.