Desarrollo

Codificador y decodificador de URL

Codifica un valor para que sobreviva dentro de una URL, o decodifica uno que llegó ilegible. Si lo que pegas tiene una query string, los parámetros se desarman más abajo para que veas lo que hay realmente dentro.

Codificar un valor usa encodeURIComponent, y codificar una URL completa usa encodeURI. Usar la función equivocada en una dirección completa la destruye.

Opciones

Las dos se aplican solo a la codificación de un valor. El modo estricto escapa además ! ' ( ) *, que OAuth y las firmas de AWS exigen.

0Caracteres de entrada
0Caracteres de salida
0Escapes

La codificación porcentual en un párrafo

Una URL solo admite un conjunto pequeño de caracteres. Todo lo demás se escribe como un signo de porcentaje seguido de los dos dígitos hexadecimales de su byte: un espacio es %20, el signo # es %23. Los caracteres que no son ASCII se convierten primero a UTF-8 y recién después se escapan byte por byte, así que é se vuelve %C3%A9 — dos escapes para un solo carácter. Una herramienta que en su lugar produce %E9 está usando Latin-1 y va a fallar con cualquier cosa moderna.

Los caracteres que nunca necesitan escape

El RFC 3986 los llama no reservados: las letras A–Z y a–z, los dígitos 0–9 y los cuatro signos - . _ ~. Significan lo mismo escapados que sin escapar, así que escaparlos es legal pero inútil, y hace que dos URLs idénticas se vean distintas para una caché.

Después están los caracteres reservados —/ ? # [ ] @ : $ & ' ( ) * + , ; =— que son la puntuación que le da estructura a una URL. Que necesiten escape o no depende por completo de dónde estén. Dentro de un valor, un & suelto abre un parámetro nuevo y corta tus datos en silencio. En la URL misma, está haciendo su trabajo.

Cuál de los dos codificadores necesitas

Esta es la distinción que hace el selector de modo de arriba, y es la misma que hay detrás de las dos funciones de JavaScript:

El signo más es genuinamente ambiguo

En el formato application/x-www-form-urlencoded —lo que envían los formularios HTML y, por lo tanto, a lo que se parece la mayoría de las query strings— un espacio se escribe como +. En el RFC 3986, que rige las URLs en general, + es un signo más literal. Los dos son correctos en su propio contexto, y una query string no te dice cuál de las dos reglas la produjo.

La consecuencia práctica: un número de teléfono en una query string es una trampa. ?tel=+44123 llega a muchos servidores como " 44123". Si un valor puede contener un más, codifícalo como %2B y deja de confiar en cualquiera de las dos convenciones. La tabla de parámetros de arriba decodifica + como espacio, porque es el caso más común, lo que significa que muestra algo incorrecto cuando el más era literal.

La doble codificación, y por qué no se puede deshacer de forma confiable

Codifica una cadena dos veces y %20 se vuelve %2520, porque el propio signo de porcentaje queda escapado. La herramienta te avisa cuando ve ese patrón, y cuando una decodificación deja escapes atrás. Lo que no puede hacer es decirte si eso fue un error: una URL que contiene el texto literal 100%25 es algo perfectamente válido de guardar. Una vez que un dato doblemente codificado llega a una base de datos, la ambigüedad es permanente.

Lo que esta herramienta no resuelve

Preguntas frecuentes

¿Cuál es la diferencia entre encodeURI y encodeURIComponent?

encodeURIComponent escapa también los caracteres estructurales / ? & = #, así que sirve para un solo valor. encodeURI los deja en paz para que una dirección completa siga siendo usable. Usar encodeURI con un dato que escribió una persona es el bug que permite que un valor se salga de su parámetro.

¿Un espacio debe ser %20 o un signo más?

Los dos aparecen en la práctica. Los envíos de formulario usan +, y el RFC 3986 usa %20 y trata al + como un más literal. %20 es seguro en todas partes, así que prefiérelo, y codifica siempre un signo más real como %2B.

¿Por qué un carácter acentuado se convierte en dos escapes?

Porque la codificación porcentual trabaja sobre bytes, no sobre caracteres, y el texto se convierte primero a UTF-8. La e con acento ocupa dos bytes en UTF-8, así que se vuelve %C3%A9. Un emoji ocupa cuatro bytes y produce cuatro escapes.

Mi texto decodificado todavía tiene signos de porcentaje. ¿Qué pasó?

Se codificó dos veces. Manda la salida de vuelta a la entrada y decodifica otra vez. La herramienta lo señala, pero no puede demostrar que la segunda pasada fue un error y no texto literal.

¿Sirve para los nombres de dominio internacionales?

No. Los nombres de host con caracteres que no son ASCII usan punycode, un algoritmo aparte que produce nombres que empiezan con xn--. Los escapes porcentuales no son válidos en absoluto dentro de un nombre de host.

Última actualización 19 de septiembre de 2026