Normalizador Unicode

A mesma string visível pode ser armazenada como sequências de bytes diferentes dependendo de o acento existir como um único ponto de código ou como uma letra mais um sinal combinante. Este normalizador converte texto entre as quatro formas de normalização Unicode (NFC, NFD, NFKC, NFKD) para que suas strings sejam comparadas corretamente em bancos de dados, índices de busca, scripts de deduplicação e correspondências de regex.

Como normalizar texto Unicode

  1. 1

    Cole sua entrada

    Insira a string: letras acentuadas, texto CJK, ligaduras, qualquer coisa que pareça inconsistente.

  2. 2

    Escolha uma forma

    Escolha NFC (composta, a forma habitual da web), NFD (decomposta), NFKC (composta de compatibilidade) ou NFKD (decomposta de compatibilidade).

  3. 3

    Compare as contagens

    A ferramenta informa o número de caracteres (pontos de código) e o comprimento em bytes antes e depois, para que você veja se a forma encurtou ou alongou a string.

  4. 4

    Copie a saída normalizada

    Use o resultado no seu banco de dados, na carga útil da API, no gerador de slugs ou em uma fixture de teste.

As quatro formas e quando usar cada uma

A normalização Unicode é definida pelo anexo padrão UAX #15. As quatro formas diferem em dois eixos: canônica versus compatibilidade, e composta versus decomposta.

Referência lado a lado

Forma Composição Mapeamento Quando usar
NFC Composta Apenas canônico Padrão para conteúdo web, bancos de dados, nomes de arquivo
NFD Decomposta Apenas canônico Processamento de texto que remove acentos por caractere
NFKC Composta Inclui compat. Busca, identificadores, filtros de spam, dobramento de exibição
NFKD Decomposta Inclui compat. Normalização agressiva antes de remover diacríticos

As formas canônicas preservam o significado

Digite é e alterne as formas. A NFC informa 1 caractere e 2 bytes (o único ponto de código U+00E9), enquanto a NFD informa 2 caracteres e 3 bytes (um e simples seguido de um acento agudo combinante, U+0301). Os dois parecem idênticos na tela, mas são sequências de bytes diferentes, e é exatamente essa divergência que a normalização corrige. As formas canônicas apenas reordenam os bytes, então é em qualquer das formas sempre significa a letra e com acento agudo.

O que “compatibilidade” realmente muda

As formas K (NFKC, NFKD) também reescrevem caracteres que parecem aparentados, mas carregam uma formatação diferente. Isso tem perda: você não consegue recuperar o original. Por exemplo:

  • fi (U+FB01, ligadura latina minúscula fi) vira fi (duas letras)
  • ① (U+2460, dígito um circunscrito) vira 1
  • ㌀ (U+3300, o quadrado CJK “apaato”) vira アパート
  • O A de largura total (U+FF21) vira A

Isso é poderoso para busca e deduplicação, mas destrutivo para a tipografia, então recorra às formas K apenas quando a fidelidade visual não importar.

Uma regra prática

  • Armazene o conteúdo do usuário em NFC.
  • Compare identificadores em NFC para que café escrito como um único ponto de código e café escrito como e + U+0301 coincidam; suba para NFKC quando também precisar que fi e fi, ou o A de largura total e A, sejam comparados como iguais, como fazem as regras de identificadores do UAX #31.
  • Gere slugs sem acentos normalizando para NFD e removendo o bloco de sinais combinantes U+0300 a U+036F.

Perguntas frequentes

Geralmente isso significa que sua entrada já estava na forma de destino. Cole texto que misture fontes (um nome de arquivo de Mac, um trecho copiado de PDF, uma linha de um banco de dados antigo) e será muito mais provável ver as contagens de caracteres e bytes mudarem.

Para URLs de exibição, NFC. Para slugs em que você quer ASCII puro, normalize para NFD, remova os sinais combinantes com um regex em U+0300 a U+036F e depois deixe tudo em minúsculas. NFKD é uma alternativa quando você também quer reduzir ligaduras e dígitos circunscritos.

As formas canônicas (NFC, NFD) nunca mudam o significado, apenas reordenam bytes. As formas de compatibilidade (NFKC, NFKD) mudam sim: as ligaduras se separam, as letras de largura total se reduzem e os expoentes se achatam. Use-as apenas quando é isso o que você deseja.

A normalização é executada no nosso servidor pela classe Normalizer do PHP e o resultado volta na mesma requisição; seu texto não é armazenado. Registramos apenas um evento anônimo indicando qual forma foi aplicada, nunca o conteúdo em si.

Ferramentas relacionadas

Ferramenta disponível em outros idiomas