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.
- café: U+00E9 → C3 A9 no final
- café: U+0065 U+0301 → 65 CC 81 no final
- 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.