Texto e código / Guias

Pontos de código Unicode, bytes UTF-8 e normalização

Um caractere na tela, um ponto de código Unicode e um byte armazenado são ideias relacionadas, mas não são a mesma unidade de texto.

Três camadas de um valor de texto

Uma pessoa vê uma sequência de texto visível, às vezes incluindo uma marca que combina com a letra anterior. O Unicode atribui pontos de código a caracteres abstratos, enquanto uma codificação como UTF-8 transforma esses pontos de código em bytes para armazenamento ou transmissão. Um caractere visível pode envolver mais de um ponto de código, e um ponto de código pode tomar mais de um byte UTF-8. A contagem de bytes, portanto, não necessariamente conta letras ou caracteres percebidos pelo usuário. A ferramenta de texto para pontos de código mostra os valores Unicode em uma string; a ferramenta de texto para bytes UTF-8 mostra uma camada diferente. Use essas visualizações para diagnosticar uma incompatibilidade, não como ortografias alternativas que podem ser substituídas sem considerar a codificação usada pelo sistema de destino.

As duas ortografias de café

A palavra visível café pode terminar com o único ponto de código U+00E9, LETRA LATINA MINÚSCULA E COM ACENTO AGUDO. Esta é uma forma composta. Também pode terminar com U+0065, LETRA LATINA MINÚSCULA E, seguido por U+0301, ACENTO AGUDO COMBINANTE. O último tem um ponto de código extra, mesmo que a palavra renderizada muitas vezes pareça a mesma. Em UTF-8 a palavra composta tem bytes hexadecimais 63 61 66 C3 A9; a palavra decomposta tem 63 61 66 65 CC 81. Essas não são as mesmas sequências de bytes, então uma comparação byte a byte ou hash pode ser diferente. NFC mapeia este exemplo para a sequência composta, enquanto NFD mapeia para a sequência decomposta. O conversor incorporado exibe esses bytes em decimal: 99 97 102 195 169 para a ortografia composta e 99 97 102 101 204 129 para a ortografia decomposta. Compare esses valores com a notação hexadecimal acima.

Uma palavra visível pode ter duas sequências Unicode e duas sequências de bytes.
  1. café: U+00E9 → C3 A9 no final
  2. café: U+0065 U+0301 → 65 CC 81 no final
  3. NFC ⇢ composto · NFD ⇢ decomposto

O que a normalização faz e não faz

A normalização Unicode fornece formas definidas de escolher uma representação para sequências canonicamente equivalentes. NFC usa composição canônica após decomposição, enquanto NFD deixa uma sequência decomposta canônica. Isso é útil antes de comparar texto que veio de diferentes teclados, arquivos ou sistemas. Ela não traduz palavras, não remove acentos nem garante que todas as strings visualmente semelhantes são iguais. Alguns caracteres semelhantes pertencem a sistemas de escrita diferentes ou têm significados distintos. As formas de compatibilidade NFKC e NFKD fazem mudanças mais amplas e podem apagar distinções de formatação, então escolha-as apenas para um propósito que permita essas mudanças. Mantenha a mesma política de normalização em todos os pontos em que os valores são comparados, indexados ou submetidos a hash; caso contrário, entradas visualmente correspondentes ainda podem tomar caminhos diferentes.

Uma sequência de depuração confiável

Quando um nome não corresponder, preserve a entrada original primeiro. Inspecione seus pontos de código para ver se um acento é um caractere pré-composto ou uma letra base mais uma marca combinante. Inspecione os bytes UTF-8 para verificar a codificação que realmente viajará por uma API ou será gravada em um arquivo. Normalize cópias para NFC ou NFD e compare os pontos de código resultantes, em seguida, tente o conversor inverso de bytes UTF-8 para texto para verificar se os bytes exatos são válidos e decodificados conforme esperado. Para troca de arquivos, registre a codificação escolhida explicitamente em vez de assumir que cada aplicativo usa o mesmo padrão. Um caractere danificado ou substituído geralmente aponta para um problema de decodificação; normalizar uma string já mal decodificada não restaurará os bytes originais perdidos.

Use o teste de igualdade correto

Para integridade exata do arquivo, hashes e assinaturas, os bytes são decisivos: mudar a normalização muda os bytes e, portanto, o digest. Para pesquisas voltadas ao usuário ou detecção de duplicatas, um produto pode deliberadamente normalizar primeiro, mas deve explicar e testar essa regra. Diferenças entre maiúsculas e minúsculas, pontuação, espaços em branco e ordenação específica de cada idioma são questões separadas; a NFC, por si só, não resolve essas questões. Não altere silenciosamente a grafia de uma pessoa ao exibi-la ou exportá-la, a menos que o fluxo de trabalho exija isso. Nas ferramentas abaixo, comece com café, inspecione os bytes UTF-8 e cole uma versão digitada com e mais um acento combinado nas ferramentas de normalização e ponto de código. A comparação mostra exatamente onde uma diferença visualmente pequena entra no pipeline de dados.

Testar o conversor

Inspecione os bytes UTF-8 de café, em seguida, tente um e decomposto mais um acento combinado.

UTF-8 serializa texto Unicode em bytes: caracteres ASCII usam um byte, enquanto muitos outros usam de dois a quatro bytes. A conversão é feita localmente no navegador.

Abrir o conversor completo

Mais guias

Guias de conversão

Explorar guias