Skip to main content
Validação HTML

O valor do atributo X no elemento Y do namespace “http://www.w3.org/1999/xhtml” não está na Forma de Normalização Unicode C.

Sobre este problema HTML

Unicode permite que certos carateres — especialmente letras acentuadas e outros carateres compostos — sejam representados de múltiplas formas. Por exemplo, a letra “é” pode ser um único carater pré-composto (U+00E9, forma NFC) ou uma letra base “e” (U+0065) seguida de um acento agudo combinado (U+0301, forma NFD). Embora possam parecer idênticos no ecrã, são sequências de bytes diferentes. A especificação HTML requer que todos os valores de atributos usem NFC para garantir comportamento consistente entre navegadores, motores de pesquisa e tecnologias assistivas.

Isto é importante por várias razões importantes:

  • Correspondência e comparação de strings: Os navegadores e scripts podem comparar valores de atributos byte-a-byte. Um valor id em forma NFD não corresponderá a um seletor CSS ou identificador de fragmento direcionado à forma NFC, causando ligações e estilos quebrados.
  • Acessibilidade: Leitores de ecrã e outras tecnologias assistivas podem processar strings NFC e NFD de forma diferente, potencialmente pronunciando mal texto ou falhando ao corresponder referências ARIA.
  • Interoperabilidade: Diferentes sistemas operativos produzem formas de normalização diferentes por defeito (os sistemas de ficheiros macOS historicamente usam NFD, por exemplo). Copiar texto de várias fontes pode introduzir carateres não-NFC sem qualquer indicação visual.
  • Conformidade com normas: A especificação HTML WHATWG e as diretrizes W3C sobre normalização recomendam explicitamente NFC para todo o conteúdo HTML.

O problema aparece mais comummente quando valores de atributos contêm carateres acentuados (como em atributos id, class, alt, title, ou value) que foram copiados de uma fonte usando normalização NFD, ou quando ficheiros são criados em sistemas que têm NFD como defeito.

Para corrigir o problema, precisa de converter os valores de atributos afetados para NFC. Pode fazê-lo através de:

  1. Reescrevendo os carateres diretamente no seu editor, que normalmente produz NFC por defeito.
  2. Usando uma ferramenta de programação como unicodedata.normalize('NFC', text) do Python, text.normalize('NFC') do JavaScript, ou utilitários semelhantes na linguagem da sua escolha.
  3. Usando um editor de texto que suporte conversão de normalização (alguns editores têm funcionalidades de normalização Unicode incorporadas ou plugins).
  4. Executando uma conversão em lote nos seus ficheiros HTML antes da implementação como parte do seu processo de construção.

Exemplos

Incorreto: Valor do atributo usa NFD (forma decomposta)

Neste exemplo, o valor do atributo id para “résumé” usa carateres decompostos (letra base + acento combinado), o que desencadeia o erro de validação. A decomposição é invisível no código fonte mas presente ao nível dos bytes.

<!-- O "é" aqui está armazenado como "e" + acento agudo combinado (NFD) -->

<div id="résumé">
  <p>O conteúdo do meu résumé</p>
</div>

Correto: Valor do atributo usa NFC (forma pré-composta)

Aqui, o valor do atributo id usa carateres pré-compostos, que é a forma NFC correta.

<!-- O "é" aqui está armazenado como um único carater pré-composto (NFC) -->

<div id="résumé">
  <p>O conteúdo do meu résumé</p>
</div>

Embora estes dois exemplos pareçam idênticos na vista do código fonte, diferem ao nível dos bytes. Pode verificar a forma de normalização usando as ferramentas de programação do navegador ou um editor hexadecimal.

Verificar e corrigir com JavaScript

Pode normalizar valores de atributos programaticamente:

<script>
  // Verificar se uma string está em NFC
  const text = "résumé";
  const nfcText = text.normalize("NFC");
  console.log(text === nfcText); // false se original era NFD
</script>

Verificar e corrigir com Python

import unicodedata

text = "r\u0065\u0301sume\u0301"  # forma NFD
normalized = unicodedata.normalize('NFC', text)
print(normalized)  # Produz forma NFC: "résumé"

Se encontrar este erro de validação, inspecione cuidadosamente o valor do atributo assinalado e assegure-se de que todos os carateres estão na sua forma NFC pré-composta. Adicionar um passo de normalização ao seu pipeline de construção é uma forma confiável de prevenir que este problema se repita.

Encontre problemas como este automaticamente

O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.

Ajude-nos a melhorar os nossos guias

Este guia foi útil?

Pronto para validar os seus sites?
Comece o seu teste gratuito hoje.