Sobre este problema HTML
O intervalo de controles C1 abrange os pontos de código Unicode U+0080 até U+009F (decimal 128–159). Estes são caracteres de controlo herdados de padrões de codificação mais antigos, e a especificação HTML proíbe explicitamente referências de caracteres numéricas que resolvem para eles. Quando o validador W3C encontra uma referência como — (decimal 151, que é U+0097), sinaliza-a porque estes pontos de código não são caracteres de conteúdo válidos.
Por que isto acontece
Este problema quase sempre resulta de uma confusão entre a codificação de caracteres Windows-1252 (ou CP-1252) e Unicode. Windows-1252 é uma codificação legada que reaproveira o intervalo de bytes 0x80–0x9F para armazenar caracteres úteis como aspas curvas, travessões longos e o símbolo do euro. No Unicode, no entanto, essas mesmas posições de pontos de código estão reservadas como caracteres de controlo C1 e não têm significado imprimível.
Quando texto originalmente codificado em Windows-1252 é convertido para referências numéricas HTML byte por byte — sem remapeamento adequado para Unicode — você acaba com referências como ” em vez do correto ” para uma aspa dupla direita. O valor do byte tinha significado em Windows-1252, mas o ponto de código Unicode correspondente é um caractere de controlo.
Por que é importante
- Conformidade com padrões: A especificação HTML proíbe estas referências. Os navegadores podem tratá-las de forma inconsistente, com alguns remapeando-as silenciosamente e outros ignorando-as completamente.
- Portabilidade: Embora alguns navegadores apliquem o remapeamento Windows-1252 como uma funcionalidade de compatibilidade, este comportamento não é garantido em todos os agentes de utilizador, plataformas ou contextos (como XML ou XHTML, onde estas referências causam erros de análise).
- Acessibilidade: Leitores de ecrã e outras tecnologias assistivas podem não interpretar caracteres de controlo C1 de todo, resultando em conteúdo em falta ou corrompido para utilizadores que dependem deles.
- Integridade dos dados: Se o seu HTML for processado por ferramentas, APIs ou analisadores que seguem rigorosamente a especificação, estas referências inválidas podem causar falhas ou perda de dados.
Como corrigir
-
Use referências de caracteres nomeadas onde disponíveis — são a opção mais legível (por exemplo,
—,’,€). -
Use pontos de código Unicode corretos em referências numéricas se uma referência nomeada não estiver disponível (por exemplo,
—ou—para um travessão longo). -
Use o caractere literal UTF-8 diretamente no seu ficheiro fonte. Se o seu documento estiver guardado como UTF-8 (como deveria estar), você pode simplesmente digitar
—,', ou€diretamente. - Audite conteúdo legado que possa ter sido migrado de sistemas ou bases de dados mais antigos usando codificação Windows-1252. Uma pesquisa por referências numéricas no intervalo decimal 128–159 encontrará todas as instâncias.
Exemplos
Inválido: Referências do intervalo de controlo C1
Estas referências resolvem para pontos de código de controlo C1, não os caracteres pretendidos:
<p>Price: €50</p>
<p>She said, “Hello.”</p>
<p>2020–2024</p>
<p>Wait — what?</p>
<p>It’s a beautiful day.</p>
Corrigido: Referências Unicode corretas
Substitua cada referência inválida pelo ponto de código Unicode adequado ou referência nomeada:
<p>Price: €50</p>
<p>She said, “Hello.”</p>
<p>2020–2024</p>
<p>Wait — what?</p>
<p>It’s a beautiful day.</p>
Corrigido: Usando pontos de código Unicode numéricos
Se você preferir referências numéricas, use os valores Unicode corretos:
<p>Price: €50</p>
<p>She said, “Hello.”</p>
<p>2020–2024</p>
<p>Wait — what?</p>
<p>It’s a beautiful day.</p>
Corrigido: Usando caracteres UTF-8 literais
A abordagem mais simples — use simplesmente os caracteres diretamente num documento codificado em UTF-8:
<p>Price: €50</p>
<p>She said, "Hello."</p>
<p>2020–2024</p>
<p>Wait — what?</p>
<p>It's a beautiful day.</p>
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.