Cómo codificar y decodificar URL

· 7 min de lectura

Si alguna vez ha visto %20 en una URL donde deberia haber un espacio, o %C3%A9 donde pertenece un caracter acentuado, ha encontrado la codificacion de URL. Es una parte fundamental de como funciona la web, y entenderla le ayuda a depurar enlaces rotos, problemas de API y envios de formularios. Un codificador basado en navegador maneja todo el trabajo localmente sin subir sus datos a un servidor.

Lo que hace la codificacion de URL

Las URL solo pueden contener un conjunto limitado de caracteres de forma segura: letras (A-Z, a-z), digitos (0-9) y algunos caracteres especiales (-, _, ., ~). Todo lo demas (espacios, caracteres acentuados, emoji y simbolos como &, =, #, ?) debe convertirse a un formato seguro.

La codificacion de URL (tambien llamada codificacion porcentual) reemplaza los caracteres inseguros con un % seguido de sus valores de byte hexadecimales:

CaracterCodificado
Espacio%20
&%26
=%3D
#%23
?%3F
/%2F
@%40
:%3A
+%2B
,%2C
;%3B
(nueva linea)%0A
(tabulacion)%09

Cuando necesita codificacion de URL

Como codificar y decodificar

  1. Elija codificar o decodificar: seleccione la direccion. Elija encodeURIComponent para parametros de consulta o encodeURI para URL completas.
  2. Pegue su entrada: ingrese el texto o URL. El resultado se actualiza instantaneamente.
  3. Copie la salida: use el resultado en su codigo, solicitud de API o navegador.

Una breve historia de la codificacion de URL

La codificacion de URL fue definida por el RFC 1738 en diciembre de 1994, junto con la especificacion URL original. El RFC fue escrito por Tim Berners-Lee (inventor de la web) con la contribucion del Grupo de Trabajo URI de IETF. El esquema de codificacion original usaba valores de byte ASCII: cada caracter reservado o inseguro se codificaba como % seguido de dos digitos hexadecimales.

La codificacion se actualizo varias veces:

El cambio mas grande fue el paso a UTF-8 en el RFC 3986. Antes de eso, las URL codificadas eran solo ASCII, y los caracteres no latinos requerian soluciones alternativas (Punycode para dominios, IDN para direcciones internacionales). Hoy, una «é» acentuada en una URL se codifica como %C3%A9 (sus dos bytes UTF-8), no el byte Latin-1 %E9 que los sistemas mas antiguos producirian.

encodeURI vs encodeURIComponent vs encodeURIFull

JavaScript tiene tres funciones de codificacion con comportamiento sutilmente diferente:

FuncionLo que codificaLo que preservaUsar para
encodeURI()Todos los caracteres insegurosSintaxis URL: : / ? & = #Codificar URL completas
encodeURIComponent()Todos los caracteres inseguros incluyendo sintaxis URLSolo A-Z a-z 0-9 - _ . ~ ! * ' ( )Valores de parametros de consulta
escape() (obsoleta)La mayoria de caracteres insegurosSolo Latin-1No usar

En Python:

En otros idiomas:

LenguajeCodificacion de componenteCodificacion URI completa
JavaURLEncoder.encode() (con advertencias sobre +)URI.toASCIIString()
C#Uri.EscapeDataStringUri.EscapeUriString
RubyCGI.escape()URI.encode_www_form_component
PHPrawurlencode()urlencode() (nota: %2B vs +)
Gourl.QueryEscape()url.PathEscape()
Rustcrate percent_encodingcrate percent_encoding

Errores comunes

Ejemplos trabajados

EntradaencodeURIencodeURIComponent
hello worldhello%20worldhello%20world
q=test&page=1q=test&page=1q%3Dtest%26page%3D1
https://x.com/pathhttps://x.com/pathhttps%3A%2F%2Fx.com%2Fpath
caf écaf%20%C3%A9caf%20%C3%A9
中文%E4%B8%AD%E6%96%87%E4%B8%AD%E6%96%87
100%100%25100%25
email@test.comemail@test.comemail%40test.com

Consejos

Privacidad y URL confidenciales

El codificador y decodificador de URL se ejecutan completamente en su navegador. Las URL que pega, el procesamiento intermedio y la salida codificada/decodificada se quedan todos en su dispositivo. Nada se sube a un servidor, se registra o se comparte con nadie.

Esto importa porque las URL frecuentemente contienen datos extremadamente sensibles: claves y tokens de API en parametros de consulta, codigos de autorizacion OAuth que otorgan acceso a la cuenta, IDs de sesion, URL firmadas para buckets S3 privados con credenciales integradas, tokens de inicio de sesion magico, URL de restablecimiento de contrasena, URL internas de administracion que revelan estructura del producto, direcciones de correo electronico del cliente en enlaces de cancelacion de suscripcion, datos personales en envios de formularios. Los codificadores URL en la nube registran cada pegado, a veces los retienen para «mejora del servicio», y han estado involucrados en filtraciones reales donde tokens de autenticacion pegados fueron extraidos por atacantes monitoreando los registros. Un codificador basado en navegador tiene exposicion cero: la URL nunca sale de su maquina.

La codificacion basada en navegador tambien funciona sin conexion una vez cargada la pagina, util para codificar URL en aviones, en entornos seguros sin acceso a internet, o en cualquier lugar donde no pueda o no deba pegar URL portadoras de autenticacion en un servicio de terceros.

Preguntas frecuentes

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

encodeURI preserva los caracteres válidos en una estructura de URL (barras, dos puntos, signos de interrogación). encodeURIComponent codifica todo salvo letras, cifras y algunos caracteres seguros. Usa encodeURIComponent para los valores de parámetros de consulta, encodeURI para las URL completas.

¿Por qué los espacios se convierten en %20 o +?

En la codificación de URL, los espacios se convierten en %20. En los datos de formulario (application/x-www-form-urlencoded), los espacios se convierten en +. Ambos son válidos en sus contextos, pero %20 es el estándar universal para las URL.

¿Tengo que codificar mis URL manualmente?

En la mayoría de los casos, tu lenguaje o framework se encarga de la codificación automáticamente. La codificación manual es útil al construir URL a mano, depurar peticiones de API o trabajar con cadenas de consulta que contienen caracteres especiales.

¿Se envían mis datos a un servidor?

No. Toda la codificación y decodificación se hace en tu navegador.