Saltar al contenido

URL Encoder / Decoder · Encoding

Codificador / Decodificador de URL y parser de query strings

Codifica un valor como su posición realmente exige, decodifica uno que volvió estropeado o pega una URL completa y lee cada parámetro de query con su texto en bruto al lado. La doble codificación, + frente a %20, los hosts en punycode y las claves repetidas se señalan por su nombre — del lado del cliente, sin subir nada.

Se ejecuta en tu navegador: nada de lo que pegas sale de esta página. Cómo lo demostramos

Se ejecuta en tu navegador RFC 3986 por componente Sin registro Actualizado el 30 jul 2026

Espacio de pruebas del codificador, decodificador y parser de query strings de URL

Examples
Mode
Options

Paste a full URL, a bare query string starting with ?, or a form body like a=1&b=2. Nothing is uploaded — the whole thing runs in this tab, so query strings carrying tokens stay yours.

Results update as you type — press Enter to run now.

Result

Paste a URL to see its components and every query parameter decoded — or switch to Decode or Encode to work on one value at a time.

La brecha

Un botón y una suposición oculta sobre dónde va el valor.

Casi toda casilla de «URL encode» de la web es un único botón conectado a encodeURIComponent(), y nunca lo dice. Esa es la regla correcta para un valor de query y la equivocada para una URL que ya has montado: dale un enlace y cada : y / vuelve como %3A y %2F. Codifica dos veces por accidente y obtienes %2520, el fallo que rompe los viajes de ida y vuelta del redirect_uri de OAuth y deja un callback de webhook en 404 a las 3 de la mañana.

Esta herramienta hace la elección explícita en vez de esconderla. Reglas de componente o de URL completa, + o %20 y —en modo Parse— los componentes que un navegador enviará de verdad junto al texto en bruto que pegaste, con cada parámetro decodificado y etiquetado: duplicado, clave sin valor, valor vacío, doblemente codificado.

Es también la razón para no preguntarle a un chatbot. Un modelo de lenguaje al que pides «codifica esto para URL» está prediciendo caracteres: mezcla + y %20 dentro de una misma cadena, olvida que é son dos bytes y «arregla» con aplomo un valor doblemente codificado codificándolo una tercera vez. Esta página ejecuta el algoritmo real, byte a byte, y fija cada regla que aplica con un vector de prueba, para que compruebes la respuesta que te dieron contra la especificación en vez de contra un párrafo seguro de sí mismo.

¿Trabajas con un token en lugar de una URL? El JWT Decoder separa y decodifica en base64url un JWT, y el Codificador / Decodificador Base64 maneja el alfabeto base64url.

El proceso

Cómo funciona.

Cuatro pasos deterministas, todos dentro de la pestaña de tu navegador: el texto en bruto se diagnostica antes de dejar que el parser de URL normalice nada.

  1. Primero, partir el texto en bruto.

    La entrada se corta por su propio ? y # antes de que ningún parser la toque, para que un diagnóstico pueda señalar el carácter exacto: el estándar de URL elimina tabulaciones y saltos de línea en silencio.

  2. Decodificar cada parte por separado.

    Nombres y valores se decodifican por separado, así un %26 dentro de un valor nunca puede volverse un separador ni un %3D partir un nombre.

  3. Leer los bytes como UTF-8.

    Los escapes se vuelven bytes y los bytes se vuelven texto. Una secuencia mal formada se nombra byte a byte en vez de lanzar el URIError que daría decodeURIComponent().

  4. Normalizar como un navegador y mostrar ambos.

    El parser WHATWG aporta lo que cualquier cliente HTTP enviará de verdad —host en punycode, puerto por defecto descartado— con tu texto en bruto al lado.

Referencia

Caracteres reservados, por componente.

RFC 3986 no tiene una única lista de caracteres «inseguros». Un carácter es reservado porque significa algo en una posición concreta, así que si hay que escaparlo depende por completo de dónde esté.

Carácter En un segmento de ruta En nombre / valor de query
/ gen-delim Hay que codificarlo (%2F) o partirá el segmento Seguro como dato, aunque algunos proxies lo normalizan
? gen-delim Hay que codificarlo (%3F): inicia el query Seguro después del primer ?
# gen-delim Hay que codificarlo (%23) Hay que codificarlo (%23): inicia el fragmento
[ ] gen-delim Hay que codificarlo (%5B %5D) Hay que codificarlo, incluso en un nombre estilo tags[]
: @ gen-delim Seguro tras el primer segmento Seguro
& sub-delim Seguro como dato Hay que codificarlo (%26): separa parámetros
= sub-delim Seguro como dato Hay que codificarlo (%3D) en un nombre; seguro en un valor
+ sub-delim Seguro como dato Hay que codificarlo (%2B): a pelo se lee como espacio
; sub-delim Seguro como dato Seguro hoy, pero un backend heredado puede partir por él
! $ ' ( ) * , sub-delim Seguro como dato Seguro como dato, pero encodeURIComponent() discrepa en ! ' ( ) *
% marcador de escape Siempre %25 Siempre %25: de un % a pelo nace la doble codificación
space no permitido %20 %20, o + en un cuerpo de formulario

Qué deja intacto cada modo

El conjunto seguro es toda la diferencia entre los modos — y entre RFC 3986 y el built-in del navegador.

safe-sets
mode                       left alone (everything else → %XX)

RFC 3986 component         A-Z a-z 0-9 - . _ ~
RFC 3986 whole URL         …plus  : / ? # [ ] @ ! $ & ' ( ) * + , ; =
form-urlencoded            A-Z a-z 0-9 * - . _        (space → +)
encodeURIComponent()       A-Z a-z 0-9 - . _ ~ ! ' ( ) *
                                                 ^^^^^^^^^^
                                       RFC 2396 leftovers — encoded here

Codificado una vez frente a dos

Un valor doblemente codificado no está corrupto: es correcto, solo una capa más profundo.

double-encoding
once   https%3A%2F%2Fapp.example.com%2Fcb   →  https://app.example.com/cb
twice  https%253A%252F%252Fapp.example.com  →  https%3A%2F%2Fapp.example.com
                 ^^^                            still escaped: decode again

space  %20    →  " "
       %2520  →  "%20"  →  " "        (the % became %25)

Siguiente paso

El parámetro que acabas de decodificar es un token. Léelo.

Los query strings transportan tokens de acceso, URLs firmadas e ids de sesión. Una vez decodificado un valor, el JWT Decoder separará y verificará un token base64url, y el Base64 Encoder / Decoder se encarga de todo lo que solo está codificado y no firmado — ambos, como esta página, enteramente en tu navegador.

callback.txt
?state=abc%3D%3D          →  state    = abc==
&channel=%23alerts       →  channel  = #alerts
&next=%252Fsettings      →  next     = %2Fsettings   ← decode again
&utm_source=a&utm_source=b  →  two rows, no winner

FAQ

Tus preguntas, respondidas.

Toca una pregunta para desplegar la respuesta.

encodeURIComponent() escapa casi todo, así que es lo que usas sobre una sola pieza de una URL: un valor de query, un segmento de ruta. encodeURI() deja intactos los caracteres reservados : / ? # & = + e incluso #, así que es lo que usas sobre una URL ya montada a la que solo hay que limpiarle los espacios y los caracteres no ASCII. Pasa una URL completa a encodeURIComponent y se convierte en un bloque opaco (https%3A%2F%2F…); pasa un solo valor a encodeURI y cualquier & que contenga se vuelve, en silencio, un separador de parámetros. El modo Encode de aquí expone ambos: el predeterminado es la regla de componente, y la casilla «Whole URL» es encodeURI() byte a byte.

Los dos son correctos, en sitios distintos. RFC 3986 solo conoce %20. La convención del + viene del envío de formularios HTML (application/x-www-form-urlencoded) y se aplica a los cuerpos de formulario y, por vieja costumbre, a los query strings — por eso URLSearchParams decodifica + como espacio pero lo deja intacto dentro de una ruta. Es decir: %20 siempre es seguro, mientras que + solo es un espacio si quien generó el valor lo decidió así. El modo Decode te muestra qué convención aplicó y te deja invertirla, para que puedas distinguir «Ada+Lovelace» el nombre de «Ada Lovelace» las dos palabras.

La codificación porcentual reemplaza un byte por un % seguido de ese byte escrito como dos dígitos hexadecimales. Una URL solo puede transportar un conjunto pequeño de caracteres ASCII, así que todo lo demás —un espacio, un acento, un emoji o un carácter reservado usado como dato— se convierte primero en bytes UTF-8 y luego cada byte se escribe como %XX. é son dos bytes, así que se vuelve %C3%A9. Decodificar hace lo inverso: reunir los bytes y volver a leerlos como UTF-8.

Decodifícala dos veces. %2520 significa que el % de %20 fue codificado a su vez como %25, lo que pasa cuando un cliente llama a encodeURIComponent() sobre un valor que ya estaba codificado: el clásico fallo del redirect_uri de OAuth. Esta herramienta lo detecta: pega el valor en el modo Decode y te avisará de que la primera pasada aún contiene escapes, te mostrará lo que produce una segunda pasada y te ofrecerá un botón «Decode again». El arreglo real está aguas arriba: codificar exactamente una vez, en el momento de meter el valor en la URL.

Porque los bytes escapados no son UTF-8 válido. %C3%A9 es una secuencia de dos bytes bien formada y decodifica a é, pero %E9 por sí solo es el byte Latin-1 (ISO-8859-1) de é y no es UTF-8 legal, así que decodifica a U+FFFD, el carácter de reemplazo. Esta herramienta nombra los bytes problemáticos en lugar de lanzar el URIError que lanzaría decodeURIComponent(), lo que te dice que el valor se codificó desde la codificación de origen equivocada en vez de dejarte adivinando.

Nada en el estándar de URL dice cuál gana, así que aquí se lista cada fila y las posteriores se marcan como duplicadas. En la práctica PHP y Express se quedan con el último valor, r.URL.Query() de Go devuelve todos, ASP.NET los une con comas y Rails solo los agrupa cuando la clave termina en []. Ese desacuerdo es justamente la razón por la que una herramienta debe mostrarte todos los valores en vez de elegir uno en silencio.

Punycode es la codificación ASCII de un nombre de dominio internacionalizado. DNS solo transporta etiquetas ASCII, así que münchen.example se convierte en xn--mnchen-3ya.example antes de cualquier resolución — y esa forma ASCII es también la que tiene que coincidir con un certificado TLS. El parser de aquí muestra el host convertido con el nombre que escribiste justo debajo, para que puedas detectar un dominio parecido. Deliberadamente no convierte punycode de vuelta a Unicode: mostrar como bonito Unicode un nombre suministrado por un atacante es exactamente cómo funciona el phishing homográfico.

El conjunto no reservado de RFC 3986 §2.3: A–Z, a–z, 0–9 y las cuatro marcas - . _ ~. Son seguros en cualquier posición y no deben codificarse gratuitamente, porque %2D y - son la misma URL y recodificarlos rompe los esquemas de firma que hashean la cadena en bruto. Ojo: encodeURIComponent() también deja intactos ! ' ( ) *, una herencia del antiguo conjunto «mark» de RFC 2396. RFC 3986 lista esos cinco como subdelimitadores, así que el modo de componente de aquí los escapa y te avisa cuando discrepa del built-in del navegador.

Ya no. HTML sugirió en su momento que los servidores aceptaran ; junto a & como separador de parámetros, y ese consejo se retiró de la especificación en 2014. Los navegadores y URLSearchParams nunca lo trataron como separador, así que a=1;b=2 es un único parámetro llamado a cuyo valor es el literal 1;b=2. Esta herramienta replica ese comportamiento y te avisa cuando ve un punto y coma, porque un backend heredado puede seguir partiendo por él y discrepar del navegador que tiene delante.

Sí: la herramienta completa es una página estática sin servidor detrás. Analizar, codificar y decodificar ocurre en la pestaña de tu navegador, nada se sube, no hay registros y no hay cuenta. Aquí importa más que en la mayoría de las herramientas, porque los query strings son justo donde acaban los tokens de acceso, las URLs firmadas, los ids de sesión y las direcciones de correo. Si quieres una segunda opinión, abre el panel de red de las herramientas de desarrollo mientras escribes: no hay ninguna petición que ver.

More free, private DevOps tools.

El URL Encoder / Decoder es una de las herramientas de OpsCanopy — un dosel creciente de validadores, conversores y probadores que funcionan en el navegador y nunca tocan un servidor.

39 herramientas gratuitas, todas pueden funcionar sin conexión — opscanopy.com funciona sin registro y sin subir nada.

Herramientas de codificación relacionadas: el Codificador / Decodificador Base64, el JWT Decoder y Slugify para convertir un título en una ruta limpia, o explora el directorio de herramientas completo.

Se ofrece tal cual por comodidad; la codificación porcentual es una codificación, no una protección: un token en un query string sigue siendo un token en un archivo de log. OpsCanopy es libre y gratuito.