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
Espacio de pruebas del codificador, decodificador y parser de query strings de URL
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.
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.
-
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.
-
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.
-
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().
-
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.
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.
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.
?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.
¿Cuál es la diferencia entre encodeURI y encodeURIComponent?
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.
¿Por qué un espacio a veces se vuelve + y a veces %20?
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.
¿Qué es exactamente la codificación porcentual?
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.
¿Cómo arreglo una URL doblemente codificada (%2520)?
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.
¿Por qué mi texto decodificado muestra � en lugar de un acento?
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.
¿Qué pasa cuando un query string repite la misma clave?
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.
¿Qué es punycode y por qué cambió mi host?
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.
¿Qué caracteres nunca necesitan codificarse en una URL?
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.
¿Puede un punto y coma separar parámetros de query?
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.
¿Es seguro pegar una URL que contiene un token?
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.
Más en Codificación
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.