Normalizador Unicode NFD
A palavra café, escrita com um único é, sai como cinco code points: c, a, f, e e um acento agudo combinante. Cada letra pré-composta é separada em base e marcas, e dois textos que parecem iguais passam a coincidir quando ambos estão em NFD. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Exemplo resolvido
- Texto
- café
- Resultado
- café
- Forma
- NFD
- Comprimento (in)
- 4
- Comprimento de saída
- 5
A forma de normalização Unicode D, ou NFD, reescreve uma string para que cada caractere pré-composto se expanda em um caractere base seguido das marcas combinantes que definem sua aparência. Um café com e-agudo pré-composto vira a sequência de cinco code points c-a-f-e mais acento agudo combinante; sílabas hangul se dividem em jamo; Å vira A mais um anel combinante. Esta capacidade recebe um campo de texto, aplica o algoritmo NFD da plataforma conforme o Unicode Standard Annex 15 e devolve a string normalizada junto com estatísticas de comprimento e um indicador de alteração.
O que a decomposição canônica NFD realmente faz
O Unicode armazena muitas letras acentuadas de duas formas: como um único code point pré-composto, por exemplo U+00E9 para o e minúsculo latino com agudo, ou como a letra base U+0065 seguida do acento agudo combinante U+0301. As duas sequências parecem iguais na tela, mas são sequências de bytes diferentes, quebram igualdade de strings e podem surpreender checagens de comprimento, regexes e restrições de unicidade em bancos de dados.
A Normalization Form D, definida no Unicode Standard Annex 15, aplica decomposição canônica: todo caractere com mapeamento de decomposição canônica é substituído por esse mapeamento, e as marcas combinantes são ordenadas pela classe de combinação para que sequências equivalentes fiquem idênticas. NFD não recompõe depois; esse passo de recomposição é NFC. NFD também não aplica mapeamentos de compatibilidade, então uma ligadura como fi ou um dígito fullwidth permanece como está — a decomposição de compatibilidade pertence a NFKD e NFKC.
Sílabas hangul recebem decomposição algorítmica especial em jamo inicial, vogal e final, por isso uma palavra coreana curta pode crescer várias vezes em comprimento de code points sem deixar de ser o mesmo texto linguístico. Como a tabela de mapeamento e a ordem das marcas são fixadas pela versão Unicode do runtime, a mesma entrada sempre produz a mesma string NFD em um motor dado.
Onde NFD aparece no trabalho real de engenharia
Pipelines de busca e autocomplete costumam remover diacríticos após NFD para que cafe case com café sem manter uma tabela de acentos escrita à mão para cada idioma. Geradores de identificadores e slugs decompõem primeiro e depois removem marcas combinantes, produzindo chaves estáveis estilo ASCII a partir de títulos orientados ao usuário. O QA de localização compara duas exportações que parecem iguais na tela, mas falham em testes de igualdade até forçar os dois lados para NFD.
Engenheiros de fontes e de shaping inspecionam sequências decompostas ao depurar ancoragem de marcas e substituição de glifos. Revisores de segurança normalizam nomes de usuário e rótulos de domínio antes de checagens de allow-list para que lookalikes pré-compostos e decompostos não contornem um filtro que listou só uma forma. Jobs de migração de dados convertem corpora legados densos em NFC para NFD quando um sistema a jusante documenta NFD como forma de armazenamento.
Cursos de programação ensinam encoding mostrando que um caractere visível pode virar dois code points após NFD, e uma landing dedicada ao normalizador atende essa intenção de busca melhor do que enterrá-la sob conversores gerais de code points Unicode ou ferramentas Base64. Prefira uma ferramenta NFC ou NFKC separada quando precisar de composição ou dobramento de compatibilidade; esta página atende quem precisa especificamente da decomposição canônica Unicode NFD e de uma string normalizada determinística para confiar em testes e pipelines.
Casos de uso
Chaves de busca cientes de diacríticos
Decomponha títulos de produto e consultas do usuário para NFD e depois remova marcas combinantes para montar índices de busca e autocomplete insensíveis a acentos.
Normalização de nomes de usuário e rótulos
Normalize nomes de conta e rótulos antes de checagens de allow-list ou unicidade para que formas pré-compostas e decompostas não divirjam.
Perguntas frequentes
O que é Unicode NFD?
NFD é a Normalization Form D do Unicode Standard Annex 15. Aplica decomposição canônica para que caracteres pré-compostos virem caractere base mais marcas combinantes, sem recompô-los em NFC.
Em que NFD difere de NFC ou NFKD?
NFC decompõe e depois recompõe para formas pré-compostas quando possível. NFKD e NFKC também aplicam mapeamentos de compatibilidade (ligaduras, formas fullwidth). Esta ferramenta aplica apenas a decomposição canônica NFD.
O que acontece se text estiver ausente ou inválido?
Text ausente, objetos que não são string, números não finitos e entrada grande demais são rejeitados. Falhas de validação não são cobradas.
O hangul é decomposto?
Sim. Sílabas hangul pré-compostas são decompostas algoritmicamente em jamo sob NFD, então texto coreano curto pode crescer em comprimento de code points sem deixar de ser o mesmo texto.
Quanto custa?
A ferramenta do navegador é gratuita e roda localmente.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/enc/unicode-nfd \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"café"}'const res = await fetch("https://api.kit.forhosting.com/enc/unicode-nfd", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "café"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/unicode-nfd",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "café"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/unicode-nfd", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"café"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"café"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/unicode-nfd", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"text": "café"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.unicode_nfd",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Entrada inválida ou ausente falha de imediato com invalid_input para que payloads ruins não inventem uma string errada em silêncio.
O que a decomposição canônica NFD realmente faz
Esta capacidade usa o método JavaScript String.prototype.normalize com a forma NFD, disponível em Workers e navegadores modernos, e é determinística: não participam chamadas de rede, sementes aleatórias nem carimbos de relógio.
Como chamar a API e ler a resposta
Strings vazias são válidas e devolvem resultado NFD vazio com changed definido como false. Um exemplo clássico com café cresce de quatro escalares para cinco e reporta changed true com uma marca combinante. ASCII simples como Hello permanece idêntico com changed false. Validação falha não consome saldo pré-pago. Envie um objeto JSON com um campo string obrigatório chamado text. Os aliases input, value, data, s, str e string são aceitos quando text é omitido, para que clientes ad hoc ainda funcionem. Números finitos e booleanos são convertidos para a forma string; objetos, arrays, text nulo, NaN e Infinity são rejeitados com invalid_input e uma mensagem clara em inglês. Strings maiores que o máximo documentado de sessenta e cinco mil quinhentos e trinta e seis unidades de código UTF-16 são rejeitadas para que uma única solicitação não monopolize um Worker. Em caso de sucesso a resposta ecoa o text original, define result como a string normalizada NFD, form como a constante NFD, changed como se result difere de text sob a desigualdade comum de strings em JavaScript, length_in e length_out como contagens de escalares Unicode antes e depois da normalização, code_units_in e code_units_out como os comprimentos UTF-16, combining_marks como uma contagem de code points de marcas combinantes comuns no resultado, e standard como um rótulo curto de UAX #15. O preço das chamadas API bem-sucedidas é a base publicada de US$ 0,002 por item com unidade item.
Onde NFD aparece no trabalho real de engenharia
Como esta capacidade é um motor parse puro, o preço da API é a base publicada de US$ 0,002 por item bem-sucedido e a validação falha não consome saldo.
Casos de integração
Testes golden estáveis entre plataformas
Force strings de fixture para NFD para que asserções de igualdade passem tanto se os dados chegaram pré-compostos quanto se já estavam decompostos.