Sobre este problema HTML
Em URLs, certos caracteres devem ser codificados por percentagem — um processo onde um carácter é substituído por % seguido de exatamente dois dígitos hexadecimais que representam o seu valor em byte. Por exemplo, um espaço torna-se %20, uma hash torna-se %23, e um ampersand torna-se %26. O próprio carácter % é o prefixo de escape, por isso quando um parser de URL encontra %, espera que os próximos dois caracteres sejam dígitos hexadecimais válidos (0–9, A–F, a–f). Se não forem, o URL está mal formado.
Este erro de validação surge tipicamente em alguns cenários:
-
Um
%literal é usado no URL sem codificação. Por exemplo, um nome de ficheiro ou segmento de caminho contém um símbolo%que não foi convertido para%25. -
Uma sequência de codificação por percentagem incompleta ou corrompida. Alguém pode ter codificado parcialmente um URL, deixando para trás sequências como
%G5ou%2que não formam códigos hexadecimais válidos de dois dígitos. -
Erros de copiar-colar. Um URL foi colado de uma fonte que removeu caracteres ou introduziu símbolos
%soltos.
Isto importa porque os browsers podem interpretar URLs mal formados de forma inconsistente. Um browser pode tentar “corrigir” o URL codificando o % solto, enquanto outro pode deixá-lo passar como está, levando a submissões de formulário quebradas ou comportamento inesperado no lado do servidor. Garantir URLs válidos no atributo action assegura comportamento previsível em todos os browsers e está em conformidade tanto com o WHATWG URL Standard como com a especificação HTML.
Como corrigir
-
Localize cada
%no URL. Verifique se cada%é seguido por exatamente dois dígitos hexadecimais (por exemplo,%20,%3A,%7E). -
Codifique caracteres
%literais. Se um%é para aparecer como um carácter literal no URL (não como parte de uma sequência de codificação por percentagem), substitua-o por%25. -
Corrija sequências incompletas. Se existir uma sequência como
%2ou%GZ, determine o carácter pretendido e codifique-o corretamente, ou remova o%solto. -
Use ferramentas de codificação adequadas. Em JavaScript, use
encodeURIComponent()ouencodeURI()para codificar URLs de forma segura. A maioria das linguagens do lado do servidor têm funções equivalentes (por exemplo,urlencode()em PHP,urllib.parse.quote()em Python).
Exemplos
% literal não codificado
Isto despoleta o erro porque %d não é uma sequência de codificação por percentagem válida (d é apenas um carácter, e o que se segue pode não ser hexadecimal):
<!-- ❌ Mau: % isolado não seguido por dois dígitos hexadecimais -->
<form action="/search?discount=20%off">
<button type="submit">Search</button>
</form>
Codifique o % como %25:
<!-- ✅ Bom: % literal codificado como %25 -->
<form action="/search?discount=20%25off">
<button type="submit">Search</button>
</form>
Sequência de codificação por percentagem incompleta
Aqui, %2 está em falta o seu segundo dígito hexadecimal:
<!-- ❌ Mau: %2 é uma sequência incompleta -->
<form action="/path/to%2file.html">
<button type="submit">Submit</button>
</form>
Se a intenção era codificar um carácter / (%2F), complete a sequência:
<!-- ✅ Bom: codificação por percentagem completa para "/" -->
<form action="/path/to%2Ffile.html">
<button type="submit">Submit</button>
</form>
Caracteres hexadecimais inválidos após %
Os caracteres G e Z não são dígitos hexadecimais:
<!-- ❌ Mau: %GZ não é hexadecimal válido -->
<form action="/data%GZprocess">
<button type="submit">Go</button>
</form>
Se %GZ nunca foi pretendido como codificação, escape o próprio %:
<!-- ✅ Bom: % literal adequadamente codificado -->
<form action="/data%25GZprocess">
<button type="submit">Go</button>
</form>
Usar JavaScript para codificar de forma segura
Ao construir URLs dinamicamente, use funções de codificação integradas para evitar este problema completamente:
const query = "20% off";
const safeURL = "/search?q=" + encodeURIComponent(query);
// Resultado: "/search?q=20%25%20off"
Isto garante que cada carácter especial — incluindo % — é adequadamente codificado por percentagem antes de ser colocado no atributo action.
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.