Cómo decodificar una URL
- Pega el enlace o el fragmento codificado en la caja, por ejemplo
a%C3%B1o%202026. El texto legible aparece al momento. - Si es una URL completa, además ves sus partes: protocolo, dominio (también en Unicode si lleva ñ o acentos), ruta, fragmento después del # y una tabla con cada parámetro ya decodificado.
- Deja marcado “Leer + como espacio” para enlaces de búsqueda y datos de formulario, donde el + significa espacio. Desmárcalo para otros textos, en los que + es solo el signo de más.
- Para codificar, elige Codificar, escribe el texto y elige cómo: parte de una URL (lo normal para el valor de un parámetro), URL completa, datos de formulario o RFC 3986 estricta.
- Pulsa Copiar junto al resultado. Si hay un % que no forma un código válido, la página te dice en qué posición está.
Por qué los enlaces se llenan de %
Una URL solo admite un conjunto pequeño de caracteres ASCII, y varios tienen una función: / separa la ruta, ? abre los parámetros, & y = los separan y # abre el fragmento. Cualquier otro carácter, y cualquiera de estos usado como dato, se escribe como un signo de porcentaje seguido de dos dígitos hexadecimales: el valor de un byte. Eso es la codificación por porcentaje (percent-encoding) de la RFC 3986.
El espacio es el byte 32, 20 en hexadecimal, por eso se vuelve %20. Los caracteres fuera del ASCII se convierten primero en sus bytes UTF-8 y cada byte recibe su propio código. Por eso el español se alarga tanto en los enlaces: la ñ ocupa dos bytes y queda como %C3%B1, la á como %C3%A1, y “año 2026” como a%C3%B1o%202026. Decodificar hace el camino inverso: cada código vuelve a ser un byte y los bytes se leen como texto UTF-8. Las letras sin tilde, los números y - . _ ~ nunca hace falta codificarlos.
Ejemplo: un enlace de tienda en línea
El ejemplo de la caja es un enlace de búsqueda como los que se comparten por WhatsApp o llevan parámetros UTM de una campaña:
https://www.ejemplo.com.mx/buscar?q=tacos+al+pastor&ciudad=Ciudad%20de%20M%C3%A9xico&cupon=ENV%C3%8DO%2BGRATIS®reso=%2Fcarrito%3Fpaso%3D2#opiniones
Tiene 10 códigos % en una sola capa. Decodificado queda así:
https://www.ejemplo.com.mx/buscar?q=tacos al pastor&ciudad=Ciudad de México&cupon=ENVÍO+GRATIS®reso=/carrito?paso=2#opiniones
La tabla de parámetros muestra 4: q = “tacos al pastor”, ciudad = “Ciudad de México”, cupon = “ENVÍO+GRATIS”, regreso = “/carrito?paso=2”. Fíjate en tres detalles. En q, los + se volvieron espacios, porque en los parámetros el + significa espacio. En cupon, el %2B se volvió un + de verdad: así se envía un signo de más dentro de un parámetro. Y el último valor es a su vez una ruta con parámetros; por eso su /, su ? y su = se codificaron: sin codificar, ese = cortaría el parámetro antes de tiempo. El fragmento, #opiniones, nunca se envía al servidor.
¿encodeURIComponent, encodeURI o formulario?
Las cuatro formas de codificar se distinguen por los caracteres que dejan intactos:
| Carácter | Parte de una URL | URL completa | Formulario | RFC 3986 estricta | |
|---|---|---|---|---|---|
| espacio | %20 | %20 | + | %20 |
& | ampersand | %26 | & | %26 | %26 |
+ | más | %2B | + | %2B | %2B |
/ | diagonal | %2F | / | %2F | %2F |
= | igual | %3D | = | %3D | %3D |
? | interrogación | %3F | ? | %3F | %3F |
# | numeral | %23 | # | %23 | %23 |
ñ | eñe | %C3%B1 | %C3%B1 | %C3%B1 | %C3%B1 |
á | a con tilde | %C3%A1 | %C3%A1 | %C3%A1 | %C3%A1 |
€ | euro | %E2%82%AC | %E2%82%AC | %E2%82%AC | %E2%82%AC |
- Parte de una URL es el
encodeURIComponentde JavaScript: codifica todo lo que tiene significado en una URL, así que el resultado sirve como valor de un parámetro, incluso una URL completa dentro de otra, como en un parámetro de redirección. - URL completa es
encodeURI: conserva; , / ? : @ & = + $ #para que la dirección siga funcionando. Úsalo para limpiar espacios y acentos de un enlace, nunca para un valor que pueda contener &. - Formulario es como el navegador envía un formulario (
application/x-www-form-urlencoded): el espacio se vuelve +, como en?q=tacos+al+pastor. - RFC 3986 estricta también codifica
! ' ( ) *, como exigen las firmas OAuth y algunas API.
Eñes rotas: ISO-8859-1, “España” y doble codificación
- Sistemas antiguos en ISO-8859-1. Muchos sistemas viejos —ERP, sitios en ASP clásico o PHP antiguo— guardaban el texto en Latin-1 (ISO-8859-1, que los navegadores leen como Windows-1252) en vez de UTF-8. Ahí la ñ es un solo byte:
Espa%F1a. Esos bytes no son UTF-8 válido, así que la página prueba con Windows-1252, muestra “España” y avisa qué juego de caracteres usó. - “España” en lugar de “España” es lo contrario: texto UTF-8 que algún programa leyó como Latin-1. Si decodificas aquí los códigos originales (
Espa%C3%B1a), recuperas la letra correcta. - Doble codificación. Cuando un enlace ya codificado pasa por otro sistema que lo codifica de nuevo, cada % se vuelve
%25:a%25C3%25B1o. La página sigue decodificando mientras queden códigos y te dice cuántas capas había —aquí 2— hasta llegar a “año”. Desmarca la opción para quitar una capa cada vez. - Un % suelto, como en “50% de descuento”, no es un código y no se puede decodificar. El mensaje indica su posición; el propio signo de porcentaje se escribe
%25.
Dominios con ñ
La ñ y las vocales con tilde también pueden ir en nombres de dominio. Viajan por internet en una forma ASCII llamada Punycode (RFC 3492), marcada con xn--: españa.es se envía como xn--espaa-rta.es. Pega cualquiera de las dos formas: la página muestra el dominio como lo envía el navegador y en Unicode. Punycode no es codificación por porcentaje, así que un dominio nunca debería aparecer con códigos %.
Consejos
- Codifica cada valor por separado y después únelos con
&y=. Si codificas la cadena de parámetros ya armada con encodeURIComponent, también se codifican los separadores. - La codificación por porcentaje no es cifrado: cualquiera la deshace. No pongas contraseñas, tokens ni datos personales (CURP, DNI, RFC) en enlaces que compartes.
- Para convertir un enlace en un código que se pueda escanear, usa el generador de código QR; para leer un JSON que venía dentro de un parámetro, el formateador de JSON.
La decodificación y la codificación se hacen en tu navegador: nada de lo que pegas se envía ni se guarda, y al recargar la página la caja queda vacía. Los enlaces suelen llevar tokens de sesión y datos personales, así que eso importa.
Preguntas frecuentes
¿Qué significa %20 en un enlace?
Es un espacio codificado: 20 es el valor hexadecimal del carácter de espacio. Pega el enlace aquí y todos los códigos vuelven a ser texto legible.
¿Por qué mi enlace tiene %C3%B1 o %C3%A1?
Son la ñ y la á en UTF-8, que ocupan dos bytes cada una; cada byte se vuelve un código %. Al decodificar, las letras regresan a su lugar.
¿Por qué aparece %2520 en la URL?
Se codificó dos veces. La primera, el espacio se volvió %20; la segunda, el propio % se volvió %25. La página lo detecta y deshace todas las capas.
¿Qué diferencia hay entre encodeURI y encodeURIComponent?
encodeURI codifica una URL completa y conserva los caracteres que le dan estructura, como / ? & = #. encodeURIComponent codifica una pieza —el valor de un parámetro o un tramo de la ruta— y codifica también esos caracteres para que no rompan la URL que la rodea.
¿El + de un enlace es un espacio?
En los parámetros de formularios y búsquedas, sí: ?q=tacos+al+pastor significa “tacos al pastor”. Fuera de ellos, y en la codificación de la RFC 3986, + es el signo de más y el espacio es %20. Para enviar un + de verdad en un parámetro, usa %2B.
¿Se envía a algún sitio el enlace que pego?
No. La página decodifica y codifica con JavaScript en tu navegador, sin enviar nada a un servidor, y no guarda lo que pegas.
Última actualización: 16 de octubre de 2026