URL Encoding Explicado: Para Qué Sirve y Cómonizar Usarlo
URL encoding (también conocido como percent-encoding) es un mecanismo fundamental en
desarrollo web que permite transmitir caracteres especiales de forma segura en URLs. Si alguna vez te
has preguntado por qué los espacios se convierten en %20 en las URLs, o por qué algunos
caracteres "rompen" tus links, esta guía completa te explicará todo lo que necesitas saber.
¿Qué es URL Encoding y por qué existe?
Las URLs (Uniform Resource Locators) fueron diseñadas originalmente para contener solo un conjunto limitado de caracteres ASCII seguros. El problema surge cuando necesit amos incluir:
- Caracteres especiales (@, #, ?, &, =, etc.)
- Espacios en blanco
- Caracteres no ASCII (acentos, ñ, emojis, caracteres asiáticos)
- Caracteres reservados que tienen significado especial en URLs
URL encoding resuelve este problema convirtiendo estos caracteres "problemáticos" en una
secuencia de bytes representada con el símbolo % seguido de dos dígitos hexadecimales.
Original:
https://ejemplo.com/buscar?q=hola mundoCodificado:
https://ejemplo.com/buscar?q=hola%20mundo
Caracteres que DEBEN ser codificados
Hay tres categorías principales de caracteres que requieren encoding:
1. Caracteres reservados
Estos caracteres tienen significado especial en URLs y SIEMPRE deben codificarse cuando se usan como datos:
| Carácter | Significado en URL | Encoding |
|---|---|---|
| ? | Inicia query string | %3F |
| & | Separa parámetros | %26 |
| = | Asigna valor a parámetro | %3D |
| # | Identifica fragmento | %23 |
| / | Separador de ruta | %2F |
| : | Separador en esquema | %3A |
| @ | Separa usuario de host | %40 |
| + | Espacio (en forms) | %2B |
2. Caracteres no seguros
Caracteres que pueden causar problemas de interpretación:
- Espacio:
%20(o+en query strings) - Comillas dobles (
"):%22 - Menor que (
<):%3C - Mayor que (
>):%3E - Corchetes (
[]):%5By%5D - Llaves (
{}):%7By%7D
3. Caracteres no-ASCII
Cualquier carácter fuera del rango ASCII básico (0-127) debe ser codificado:
• "España" →
Espa%C3%B1a• "北京" (Beijing)→
%E5%8C%97%E4%BA%AC• "😀" (emoji) →
%F0%9F%98%80
⚠️ Importante: URL encoding usa UTF-8 para representar caracteres no-ASCII. Cada
byte UTF-8 se representa con su valor hexadecimal precedido por %.
Cuándo usar URL Encoding: Escenarios reales
1. Parámetros de búsqueda (Query Strings)
El caso de uso más común: cuando pasas datos en query parameters.
// ❌ INCORRECTO
https://api.ejemplo.com/buscar?q=Juan & María
// ✅ CORRECTO
https://api.ejemplo.com/buscar?q=Juan%20%26%20Mar%C3%ADa
Sin encoding, el & se interpreta como separador de parámetros, rompiendo la URL.
2. Datos en formularios HTML
Cuando envías formularios con método GET, los navegadores automátic codifican los valores:
<form action="/buscar" method="GET">
<input name="q" value="hola mundo">
</form>
Nota: En formularios, los espacios se codifican como + en lugar de %20.
3. Rutas de API con identificadores
Cuando los identificadores contienen caracteres especiales:
// Usuario con email como ID
// ❌ INCORRECTO
GET /api/usuarios/juan@ejemplo.com
// ✅ CORRECTO
GET /api/usuarios/juan%40ejemplo.com
4. Compartir URLs en redes sociales
Especialmente importante cuando generas enlaces para compartir en Twitter, Facebook, etc:
const textoCompartir = "¡Mira este artículo increíble sobre URL encoding!";
const urlCompartir = `https://twitter.com/intent/tweet?text=${encodeURIComponent(textoCompartir)}`;
// Resultado: https://twitter.com/intent/tweet?text=%C2%A1Mira%20este%20art%C3%ADculo...
5. Redirecciones con URLs como parámetros
Cuando pasas una URL completa como parámetro de otra URL:
// URL destino
const destino = "https://ejemplo.com/pagina?param=valor";
// ❌ INCORRECTO
const redirect = `https://auth.com/login?redirect=https://ejemplo.com/pagina?param=valor`;
// ✅ CORRECTO
const redirect = `https://auth.com/login?redirect=${encodeURIComponent(destino)}`;
// Resultado: https://auth.com/login?redirect=https%3A%2F%2Fejemplo.com%2Fpagina%3Fparam%3Dvalor
Cómo codificar URLs en diferentes lenguajes
JavaScript
JavaScript ofrece tres funciones diferentes para encoding:
// 1. encodeURI() - Para URLs completas
const urlCompleta = encodeURI("https://ejemplo.com/búsqueda?q=hola mundo");
// https://ejemplo.com/b%C3%BAsqueda?q=hola%20mundo
// 2. encodeURIComponent() - Para componentes individuales (MÁS COMÚN)
const parametro = encodeURIComponent("Juan & María");
const url = `https://api.com/buscar?q=${parametro}`;
// https://api.com/buscar?q=Juan%20%26%20Mar%C3%ADa
// 3. escape() - OBSOLETO, no usar
Regla de oro: Usa encodeURIComponent() para parámetros y valores,
encodeURI() solo para URLs completas.
Python
from urllib.parse import quote, urlencode
# Para valores individuales
nombre = quote("Juan & María")
# 'Juan%20%26%20Mar%C3%ADa'
# Para diccionarios completos (query strings)
params = urlencode({'q': 'Juan & María', 'page': 1})
# 'q=Juan+%26+Mar%C3%ADa&page=1'
PHP
// rawurlencode() - Para valores individuales
$nombre = rawurlencode("Juan & María");
// "Juan%20%26%20Mar%C3%ADa"
// urlencode() - Para formularios (espacios como +)
$nombre = urlencode("Juan & María");
// "Juan+%26+Mar%C3%ADa"
// http_build_query() - Para arrays completos
$params = http_build_query(['q' => 'Juan & María']);
// "q=Juan+%26+Mar%C3%ADa"
Java
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
String nombre = URLEncoder.encode("Juan & María", StandardCharsets.UTF_8);
// "Juan+%26+Mar%C3%ADa"
🔗 Codifica URLs Online
Herramienta gratuita para codificar y decodificar URLs al instante
Probar Codificador →Errores comunes y cómo evitarlos
1. Doble encoding
Uno de los errores más frecuentes: codificar una URL que ya estaba codificada.
// ❌ INCORRECTO
const valor = "Juan & María";
const codificado = encodeURIComponent(valor); // "Juan%20%26%20Mar%C3%ADa"
const dobleCodificado = encodeURIComponent(codificado); // "Juan%2520%2526%2520Mar%25C3%25ADa"
Solución: Decodifica primero si no estás seguro del estado:
function encodeSafe(valor) {
try {
// Intenta decodificar primero
const decoded = decodeURIComponent(valor);
return encodeURIComponent(decoded);
} catch {
// Si falla, asume que no está codificado
return encodeURIComponent(valor);
}
}
2. No codificar el signo +
En query strings, + se interpreta como espacio, así que si necesitas un +
literal, debe codificarse:
// Buscar "C++" en un buscador
// ❌ INCORRECTO
?q=C++ // Se interpreta como "C " (con dos espacios)
// CORRECTO
?q=C%2B%2B
3. Codificar rutas de archivo completas
No uses encodeURI() en rutas si quieres mantener las barras:
// ❌ Mal para rutas
encodeURI("/carpeta/archivo.txt") // "/carpeta/archivo.txt" (no cambia)
// ✅ Usa encodeURIComponent() solo en el nombre
const carpeta = "mi carpeta";
const archivo = "mi archivo.txt";
const ruta = `/${encodeURIComponent(carpeta)}/${encodeURIComponent(archivo)}`;
// "/mi%20carpeta/mi%20archivo.txt"
Decodificar URLs
Para revertir el proceso de encoding y obtener el texto original:
JavaScript
const encoded = "Juan%20%26%20Mar%C3%ADa";
const decoded = decodeURIComponent(encoded);
// "Juan & María"
Python
from urllib.parse import unquote
decoded = unquote("Juan%20%26%20Mar%C3%ADa")
# "Juan & María"
PHP
$decoded = rawurldecode("Juan%20%26%20Mar%C3%ADa");
// "Juan & María"
Mejores prácticas para trabajar con URLs
- Siempre codifica parámetros de usuario: Nunca confíes en que no contendrán caracteres especiales
- Valida después de decodificar: Verifica que el contenido decodificado es lo que esperas
- Usa librerías standard: No implementes tu propio encoding, usa las funciones nativas del lenguaje
- Ten cuidado con encoding múltiple: Trackea qué partes de tu código ya han codificado datos
- Documenta el formato esperado: Si tu API espera datos codificados, especifícalo claramente
- Testing con casos edge: Prueba con caracteres especiales, emojis, y diferentes idiomas
Herramientas complementarias
Trabaja más eficientemente con URLs utilizando estas herramientas adicionales:
- Base64 Encoder: Para codificar datos binarios en URLs
- JSON Formatter: Formatea JSON antes de incluirlo en URLs
- Text Cleaner: Limpia texto ames de codificar
Conclusión
URL encoding es fundamental para trabajar con web APIs, formularios y cualquier sistema que transmita datos a través de URLs. Los conceptos clave son:
- ✅ Codifica siempre los parámetros de usuario con
encodeURIComponent() - ✅ Entiende la diferencia entre caracteres reservados y no seguros
- ✅ Evita el doble encoding verificando el estado antes de codificar
- ✅ Usa las funciones nativas de tu lenguaje de programación
- ✅ Testea con caracteres especiales, espacios y caracteres no-ASCII
Dominar URL encoding te ahorrará horas de debugging y evitará bugs difíciles de rastrear en producción.