Skip to main content
Validación HTML

Valor incorrecto para el atributo “action” en el elemento “form”: El porcentaje (“%”) no está seguido de dos dígitos hexadecimales.

Acerca de este problema HTML

En las URLs, ciertos caracteres deben codificarse porcentualmente — un proceso donde un carácter se reemplaza por % seguido de exactamente dos dígitos hexadecimales que representan su valor de byte. Por ejemplo, un espacio se convierte en %20, un hash se convierte en %23, y un ampersand se convierte en %26. El carácter % en sí es el prefijo de escape, por lo que cuando un analizador de URL encuentra %, espera que los dos caracteres siguientes sean dígitos hexadecimales válidos (0–9, A–F, a–f). Si no lo son, la URL está mal formada.

Este error de validación típicamente surge en varios escenarios:

  • Un % literal se usa en la URL sin codificar. Por ejemplo, un nombre de archivo o segmento de ruta contiene un signo % que no fue convertido a %25.
  • Una secuencia de codificación porcentual incompleta o corrupta. Alguien puede haber codificado parcialmente una URL, dejando secuencias como %G5 o %2 que no forman códigos hexadecimales válidos de dos dígitos.
  • Errores de copiar y pegar. Una URL fue pegada desde una fuente que eliminó caracteres o introdujo símbolos % perdidos.

Esto importa porque los navegadores pueden interpretar URLs mal formadas de manera inconsistente. Un navegador podría intentar “arreglar” la URL codificando el % perdido, mientras que otro podría pasarlo tal como está, llevando a envíos de formularios rotos o comportamiento inesperado del lado del servidor. Asegurar URLs válidas en el atributo action garantiza comportamiento predecible en todos los navegadores y cumple tanto con el WHATWG URL Standard como con la especificación HTML.

Cómo solucionarlo

  1. Localiza cada % en la URL. Verifica si cada % está seguido de exactamente dos dígitos hexadecimales (por ejemplo, %20, %3A, %7E).
  2. Codifica los caracteres % literales. Si un % está destinado a aparecer como un carácter literal en la URL (no como parte de una secuencia de codificación porcentual), reemplázalo con %25.
  3. Corrige las secuencias incompletas. Si existe una secuencia como %2 o %GZ, determina el carácter deseado y codifícalo correctamente, o elimina el % perdido.
  4. Usa herramientas de codificación adecuadas. En JavaScript, usa encodeURIComponent() o encodeURI() para codificar URLs de forma segura. La mayoría de los lenguajes del lado del servidor tienen funciones equivalentes (por ejemplo, urlencode() en PHP, urllib.parse.quote() en Python).

Ejemplos

% literal no codificado

Esto desencadena el error porque %d no es una secuencia de codificación porcentual válida (d es solo un carácter, y lo que sigue puede no ser hexadecimal):

<!-- ❌ Malo: % aislado no seguido de dos dígitos hexadecimales -->

<form action="/search?discount=20%off">
  <button type="submit">Search</button>
</form>

Codifica el % como %25:

<!-- ✅ Bueno: % literal codificado como %25 -->

<form action="/search?discount=20%25off">
  <button type="submit">Search</button>
</form>

Secuencia de codificación porcentual incompleta

Aquí, %2 le falta su segundo dígito hexadecimal:

<!-- ❌ Malo: %2 es una secuencia incompleta -->

<form action="/path/to%2file.html">
  <button type="submit">Submit</button>
</form>

Si la intención era codificar un carácter / (%2F), completa la secuencia:

<!-- ✅ Bueno: codificación porcentual completa para "/" -->

<form action="/path/to%2Ffile.html">
  <button type="submit">Submit</button>
</form>

Caracteres hexadecimales inválidos después de %

Los caracteres G y Z no son dígitos hexadecimales:

<!-- ❌ Malo: %GZ no es hexadecimal válido -->

<form action="/data%GZprocess">
  <button type="submit">Go</button>
</form>

Si %GZ nunca fue destinado como codificación, escapa el % en sí:

<!-- ✅ Bueno: % literal correctamente codificado -->

<form action="/data%25GZprocess">
  <button type="submit">Go</button>
</form>

Usar JavaScript para codificar de forma segura

Al construir URLs dinámicamente, usa funciones de codificación integradas para evitar este problema por completo:

const query = "20% off";
const safeURL = "/search?q=" + encodeURIComponent(query);
// Resultado: "/search?q=20%25%20off"

Esto asegura que cada carácter especial — incluyendo % — esté correctamente codificado porcentualmente antes de colocarlo en el atributo action.

Encuentra problemas como este automáticamente

Rocket Validator escanea miles de páginas en segundos, detectando problemas de HTML en todo tu sitio web.

Ayúdanos a mejorar nuestras guías

¿Te ha sido útil esta guía?

¿Listo para validar tus sitios?
Inicia tu prueba gratuita hoy.