Sobre este problema HTML
A especificação HTML proíbe explicitamente que determinados pontos de código Unicode apareçam em qualquer lugar de um documento HTML. Estes incluem a maioria dos caracteres de controlo ASCII (como U+0000 NULL, U+0008 BACKSPACE, ou U+000B VERTICAL TAB), bem como não-caracteres Unicode como U+FFFE, U+FFFF, e o intervalo U+FDD0 a U+FDEF. Quando o validador W3C encontra um destes pontos de código, reporta o erro “Forbidden code point” seguido do valor específico.
Estes caracteres são proibidos porque não têm significado definido em HTML e podem causar comportamento imprevisível entre navegadores e plataformas. Alguns podem ser silenciosamente removidos, outros podem produzir falhas de renderização, e alguns podem interferir com a análise. Leitores de ecrã e outras tecnologias assistivas também podem comportar-se de forma errática ao encontrar estes caracteres, tornando isto também uma preocupação de acessibilidade.
Como os caracteres proibidos entram no seu código
- Cópia e colagem de fontes externas como processadores de texto, PDFs, ou bases de dados que incorporam caracteres de controlo invisíveis.
- Editores de texto ou ferramentas de build defeituosos que introduzem bytes perdidos durante o processamento de ficheiros.
- Codificação de caracteres incorreta onde sequências de bytes são mal interpretadas, resultando em pontos de código proibidos.
- Geração de conteúdo programática onde strings não são adequadamente sanitizadas antes de serem inseridas em HTML.
Como corrigir
-
Identifique o caráter e a sua localização. A mensagem do validador inclui o ponto de código (ex:
U+000B) e o número da linha. Use um editor de texto que possa mostrar caracteres invisíveis (como o VS Code com a configuração “Render Whitespace” ou “Render Control Characters” ativada, ou um editor hexadecimal). - Remova ou substitua o caráter. Na maioria dos casos, o caráter proibido não serve nenhum propósito e pode simplesmente ser eliminado. Se estava a substituir um espaço ou quebra de linha, substitua-o pelo caráter padrão apropriado.
- Sanitize o conteúdo na origem. Se o seu HTML for gerado dinamicamente, remova pontos de código proibidos das strings antes de as enviar. Em JavaScript, pode usar uma expressão regular para os remover.
// Remove common forbidden code points
text = text.replace(/[\x00-\x08\x0B\x0E-\x1F\x7F\uFDD0-\uFDEF\uFFFE\uFFFF]/g, '');
Exemplos
Incorreto — contém um caráter de controlo proibido
Neste exemplo, um caráter de tabulação vertical (U+000B) está incorporado entre “Hello” e “World.” É invisível na maioria dos editores mas o validador irá sinalizá-lo.
<!-- The ␋ below represents U+000B VERTICAL TAB, an invisible forbidden character -->
<p>Hello␋World</p>
Correto — caráter proibido removido
<p>Hello World</p>
Incorreto — caráter NULL num valor de atributo
Um caráter U+0000 NULL pode aparecer dentro de um atributo, frequentemente de saída programática.
<!-- The attribute value contains a U+0000 NULL byte -->
<div title="SomeText">Content</div>
Correto — caráter NULL removido do atributo
<div title="SomeText">Content</div>
Caracteres de controlo permitidos
Nem todos os caracteres de controlo são proibidos. Os seguintes são explicitamente permitidos em HTML:
-
U+0009— Tabulação horizontal (caráter de tabulação normal) -
U+000A— Avanço de linha (newline) -
U+000D— Retorno de carro
<pre>Line one
Line two with a tab</pre>
Isto é válido porque usa apenas caracteres de espaçamento padrão (U+000A para a nova linha e U+0009 para a tabulação).
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.