Codificar / Decodificar URL

Codifica o decodifica URLs y query strings con porcentajes.

100% en tu navegador — no se sube nada

Codificar y decodificar URLs online

Ejemplo cargado: edítalo o límpialo

Sobre este codificador de URLs

Las URLs solo admiten un conjunto limitado de caracteres, así que los espacios, las tildes, la ñ, el signo & y casi todos los símbolos tienen que codificarse con porcentajes: un espacio se vuelve %20 y la ñ se vuelve %C3%B1. Pega tu texto, presiona Codificar o Decodificar y el resultado aparece abajo. Todo ocurre dentro de tu navegador, así que un query string con tokens o datos de clientes nunca sale de tu equipo.

Hay dos modos. El modo componente usa encodeURIComponent y escapa todo lo que no sea letra, dígito o uno de estos: - _ . ! ~ * ' ( ). Eso incluye /, ?, & y =, por lo que sirve para un valor individual que va dentro de un query string. El modo URL completa usa encodeURI, que deja intactos los caracteres estructurales para que la dirección siga funcionando como dirección. El modo componente es el que necesitas casi siempre; el de URL completa es para arreglar una dirección que te pasaron con espacios o acentos adentro.

El percent-encoding trabaja sobre bytes, no sobre caracteres, y ahí está la trampa para el español. Cada byte se convierte en un % seguido de dos dígitos hexadecimales, y una letra acentuada en UTF-8 ocupa dos bytes: la é es un solo carácter pero son los bytes C3 A9, por eso queda como %C3%A9 y no como un solo triplete. Lo mismo pasa con la ñ (%C3%B1), la ü (%C3%BC) y los signos de apertura ¿ (%C2%BF) y ¡ (%C2%A1). El RFC 3986 considera %c3%a9 y %C3%A9 equivalentes y recomienda mayúsculas al normalizar.

Dos errores explican casi todos los problemas. El primero es la doble codificación: si pasas el mismo texto por un codificador dos veces, cada % se vuelve %25 y caf%C3%A9 termina como caf%25C3%25A9. Cuando veas %25 en una URL, algo codificó un texto que ya estaba codificado, y una sola pasada de decodificación no alcanza. El segundo es el signo +. En los query strings de formularios el + significa espacio, pero decodeURIComponent no lo sabe y te devuelve un + literal. Esta herramienta convierte todo + en espacio antes de decodificar, lo cual es correcto para datos de formulario y equivocado si tu valor lleva un más de verdad — una firma en base64, o un teléfono en formato +1. En ese caso el + debía haberse codificado como %2B antes de llegar a la URL.

Un aviso sobre el dominio: las tildes y la ñ del nombre de dominio no se codifican con porcentajes. Ahí manda Punycode, así que españa.com viaja como xn--espaa-rta.com; solo la ruta, el query y el fragmento usan percent-encoding. Y si armas URLs desde código, no las concatenes a mano: los objetos URL y URLSearchParams se encargan del escapado, de unir los parámetros y de la convención del +. Esta herramienta es para inspeccionar, depurar y arreglar URLs que ya existen, no para construirlas.

Tabla de caracteres reservados (RFC 3986) y cómo se codifican las tildes

El RFC 3986 divide el ASCII en tres grupos. Los no reservados — A–Z, a–z, 0–9 y - . _ ~ — son siempre seguros. Los reservados son los delimitadores que le dan estructura a la URL: se codifican solo cuando el carácter es dato y no puntuación. Todo lo demás no tiene lugar legal dentro de una URL y hay que codificarlo siempre. Los reservados se dividen en gen-delims, que separan las partes grandes de la dirección, y sub-delims, que se usan dentro de esas partes.

CarácterCodificadoQué delimita
:%3ACierra el esquema (https:) y separa el host de su puerto
/%2FSepara segmentos de ruta; // al inicio abre la autoridad
?%3FEmpieza el query string
#%23Empieza el fragmento — nada de lo que sigue llega al servidor
[%5BAbre un host IPv6 literal, como en http://[::1]/
]%5DCierra un host IPv6 literal
@%40Separa el userinfo del host, como en usuario@ejemplo.com

Los sub-delims son los otros once reservados: ! $ & ' ( ) * + , ; = — codificados %21 %24 %26 %27 %28 %29 %2A %2B %2C %3B %3D. En un query string los que de verdad importan son & (separa un parámetro del siguiente), = (separa el nombre del valor) y + (que en datos de formulario se lee como espacio). Detalle útil: encodeURIComponent deja sin escapar ! ’ ( ) * aunque el RFC los lista como reservados. Y lo que no esté en ninguno de esos grupos va codificado sí o sí: el espacio es %20 y el propio signo de porcentaje es %25, porque es el carácter de escape.

Las letras con tilde, la ñ y los signos de apertura ocupan dos bytes en UTF-8, así que cada uno produce dos tripletes. Esta es la tabla para cuando lees un log o depuras una búsqueda en español:

CarácterBytes UTF-8Percent-encoding
áC3 A1%C3%A1
éC3 A9%C3%A9
íC3 AD%C3%AD
óC3 B3%C3%B3
úC3 BA%C3%BA
ñ / ÑC3 B1 / C3 91%C3%B1 / %C3%91
üC3 BC%C3%BC
¿ / ¡C2 BF / C2 A1%C2%BF / %C2%A1

Ojo con el dominio: ahí no se usa percent-encoding. Un nombre de dominio con tildes o ñ se convierte a Punycode con el prefijo xn--, de modo que españa.com viaja como xn--espaa-rta.com y piñata.mx como xn--piata-pta.mx. Si codificas el host con %C3%B1 la dirección no resuelve. Solo la ruta, el query y el fragmento usan porcentajes.

Entrada             https://ejemplo.com/búsqueda?q=café con leche&x=a+b#top

URL completa        https://ejemplo.com/b%C3%BAsqueda?q=caf%C3%A9%20con%20leche&x=a+b#top
Componente          https%3A%2F%2Fejemplo.com%2Fb%C3%BAsqueda%3Fq%3Dcaf%C3%A9%20con%20leche%26x%3Da%2Bb%23top
El modo URL completa deja la dirección utilizable; el modo componente la convierte en un solo valor opaco. Fíjate en que encodeURI no toca ni el + de a+b ni el #.

Por último, si el destino es un formulario y no una URL: URLSearchParams escribe los espacios como + (caf%C3%A9+con+leche) y encodeURIComponent como %20 (caf%C3%A9%20con%20leche). Los dos son válidos — el + viene de application/x-www-form-urlencoded, el formato que los formularios HTML usan desde los años noventa y que el estándar URL del WHATWG todavía especifica. El problema aparece cuando el servidor adivina mal cuál está leyendo. Al decodificar, esta herramienta asume el formato de formulario y convierte cada + en espacio.

Tablas de referencia

Preguntas frecuentes

¿Cuándo uso modo componente vs URL completa?

Usa modo componente para un valor individual dentro de un query string. Usa modo URL completa cuando codificas una URL entera cuyas barras y signos de interrogación deben quedar intactos.

¿Por qué mi texto decodificado muestra caracteres raros?

Probablemente estaba doblemente codificado. Decodifícalo una segunda vez.

¿El signo + significa espacio?

En query strings, históricamente sí. Esta herramienta decodifica + como espacio al decodificar, y codifica espacios como %20.

Herramientas relacionadas