ToolPal
Primer plano de la página de inicio de Google en una pantalla con opciones de búsqueda

Codificación de URL explicada — Todo lo que necesitas saber

📷 Sarah Blocksidge / Pexels

Codificación de URL explicada — Todo lo que necesitas saber

Aprende todo sobre la codificación de URL (codificación porcentual): caracteres reservados, UTF-8 en URLs, problemas comunes y ejemplos prácticos. Una referencia completa para desarrolladores web.

DPor Daniel Park3 de abril de 20269 min de lectura

Introducción: ¿qué es la codificación de URL?

La codificación de URL, también conocida como codificación porcentual o percent-encoding, es un mecanismo para convertir caracteres en un formato que puede transmitirse de forma segura en las URL. Dado que las URL solo pueden contener un conjunto limitado de caracteres del conjunto de caracteres ASCII, cualquier carácter fuera de este conjunto — o cualquier carácter con significado especial en la sintaxis de URL — debe codificarse.

¿Alguna vez has visto %20 en una URL y te has preguntado qué significa? ¿O has tenido problemas con enlaces rotos que contienen caracteres especiales? Esta guía te dará una comprensión profunda de cómo funciona la codificación de URL y por qué es importante.

¿Necesitas codificar o decodificar rápidamente una URL? Prueba nuestra herramienta Codificador/Decodificador de URL — maneja todas las reglas de codificación automáticamente.

Por qué existe la codificación de URL

Las URL fueron diseñadas en los primeros días de internet cuando los sistemas tenían soporte limitado para conjuntos de caracteres. La especificación original de URL (RFC 1738, publicada en 1994) restringía las URL a un pequeño subconjunto de caracteres ASCII. Fue una decisión práctica que garantizaba que las URL funcionarían en diferentes sistemas, redes y protocolos.

El problema es que el mundo real requiere mucho más que el ASCII básico:

  • Espacios en nombres de archivos: mi documento.pdf necesita codificarse como mi%20documento.pdf
  • Caracteres internacionales: español, chino, árabe y otros scripts necesitan codificación
  • Caracteres especiales en datos: los parámetros de consulta pueden contener caracteres como &, =, # que tienen significado especial en las URL
  • Datos binarios: a veces es necesario incluir datos binarios en las URL

La codificación de URL resuelve todos estos problemas proporcionando un mecanismo de escape universal.

Cómo funciona la codificación porcentual

El algoritmo de codificación porcentual es sencillo:

  1. Tomar el carácter a codificar
  2. Convertirlo a su representación en bytes (usando UTF-8 para caracteres no ASCII)
  3. Para cada byte, escribir un % seguido de dos dígitos hexadecimales

Ejemplos

CarácterBytes UTF-8Codificado
Espacio0x20%20
!0x21%21
#0x23%23
$0x24%24
&0x26%26
+0x2B%2B
/0x2F%2F
=0x3D%3D
?0x3F%3F
@0x40%40

Caracteres multibyte

Los caracteres no ASCII requieren múltiples bytes en UTF-8 y por tanto producen múltiples secuencias codificadas en porcentaje:

CarácterBytes UTF-8Codificado
é (con acento)0xC3 0xA9%C3%A9
ñ0xC3 0xB1%C3%B1
á0xC3 0xA1%C3%A1
Signo euro0xE2 0x82 0xAC%E2%82%AC
Emoji (sonrisa)0xF0 0x9F 0x98 0x80%F0%9F%98%80

Prueba a codificar estos caracteres con nuestra herramienta URL Encoder.

Estructura de URL y caracteres reservados

Para entender correctamente la codificación de URL, necesitas comprender la estructura de una URL:

https://user:pass@www.example.com:8080/path/to/page?key=value&foo=bar#section
|_____|  |______| |_______________|____||___________|_________________|_______|
esquema  info usr     host         puerto  ruta         consulta      fragmento

Caracteres reservados

Los caracteres reservados tienen significados especiales en las URL. Si quieres usarlos como datos (en lugar de como delimitadores), deben codificarse en porcentaje.

CarácterPropósito en URLForma codificada
:Separa esquema, puerto, info de usuario%3A
/Separa segmentos de ruta%2F
?Inicia cadena de consulta%3F
#Inicia fragmento%23
@Separa info de usuario del host%40
&Separa parámetros de consulta%26
=Separa clave de valor en consulta%3D
+Espacio en cadenas de consulta (legado)%2B

Caracteres no reservados

Estos caracteres nunca necesitan codificarse en ninguna parte de una URL:

  • Letras: A-Z y a-z
  • Dígitos: 0-9
  • Guión: -
  • Punto: .
  • Guión bajo: _
  • Tilde: ~

El carácter espacio: %20 vs +

La codificación de espacios es uno de los aspectos más confusos de la codificación de URL:

  • %20: La codificación porcentual correcta para un espacio, usada en segmentos de ruta
  • +: Una codificación alternativa para el espacio, pero solo válida en cadenas de consulta (del formato application/x-www-form-urlencoded)
Ruta:    https://example.com/mis%20documentos/nombre%20archivo.pdf  (correcto)
Ruta:    https://example.com/mis+documentos/nombre+archivo.pdf      (INCORRECTO)

Consulta: https://example.com/search?q=hola+mundo                   (correcto)
Consulta: https://example.com/search?q=hola%20mundo                 (también correcto)

Mejor práctica: Usa %20 en segmentos de ruta y + o %20 en cadenas de consulta. Ante la duda, %20 siempre funciona.

Codificación de URL en diferentes lenguajes de programación

JavaScript

JavaScript proporciona varias funciones para la codificación de URL, cada una con un alcance diferente:

// encodeURIComponent - Codificar un componente de URI (valor de parámetro)
encodeURIComponent('hola mundo & adiós')
// Resultado: "hola%20mundo%20%26%20adi%C3%B3s"

// encodeURI - Codificar una URI completa (preserva caracteres de estructura URL)
encodeURI('https://example.com/ruta con espacios?q=hola mundo')
// Resultado: "https://example.com/ruta%20con%20espacios?q=hola%20mundo"

// decodeURIComponent - Decodificar un componente de URI
decodeURIComponent('hola%20mundo%20%26%20adi%C3%B3s')
// Resultado: "hola mundo & adiós"

Diferencia clave entre encodeURI y encodeURIComponent:

FunciónNO codificaCaso de uso
encodeURI:, /, ?, #, &, =, @, +Codificar una URL completa
encodeURIComponentSolo caracteres no reservadosCodificar un valor de parámetro

La API URLSearchParams

JavaScript moderno proporciona URLSearchParams para manejar cadenas de consulta:

// Crear cadenas de consulta
const params = new URLSearchParams();
params.set('nombre', 'Juan García');
params.set('ciudad', 'Madrid');
params.set('intereses', 'programación & diseño');
console.log(params.toString());

// Analizar cadenas de consulta
const url = new URL('https://example.com/search?q=hola+mundo&page=2');
console.log(url.searchParams.get('q'));   // "hola mundo"
console.log(url.searchParams.get('page')); // "2"

Python

from urllib.parse import quote, unquote, urlencode, parse_qs

# Codificar una cadena para usar en una ruta URL
quote('hola mundo/ruta')  # 'hola%20mundo/ruta' (/ no codificado)
quote('hola mundo/ruta', safe='')  # 'hola%20mundo%2Fruta'

# Decodificar una cadena codificada en porcentaje
unquote('hola%20mundo')  # 'hola mundo'

# Construir cadenas de consulta
params = {'q': 'hola mundo', 'categoria': 'libros & medios'}
urlencode(params)  # 'q=hola+mundo&categoria=libros+%26+medios'

Java

import java.net.URLEncoder;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

// Codificar
String encoded = URLEncoder.encode("hola mundo & más", StandardCharsets.UTF_8);
// Resultado: "hola+mundo+%26+m%C3%A1s"

// Decodificar
String decoded = URLDecoder.decode("hola+mundo+%26+m%C3%A1s", StandardCharsets.UTF_8);
// Resultado: "hola mundo & más"

PHP

// Codificación URL (espacios como +)
urlencode('hola mundo & más');  // "hola+mundo+%26+m%C3%A1s"

// Codificación URL sin formato (espacios como %20)
rawurlencode('hola mundo & más');  // "hola%20mundo%20%26%20m%C3%A1s"

// Construir cadena de consulta
http_build_query(['q' => 'hola mundo', 'pagina' => 1]);
// "q=hola+mundo&pagina=1"

UTF-8 y caracteres internacionales en URLs

El estándar IRI

Los Identificadores de Recursos Internacionalizados (IRI, definidos en RFC 3987) extienden las URL para soportar caracteres Unicode. Sin embargo, cuando se transmiten por la red, los IRI se convierten a URI usando codificación porcentual UTF-8.

IRI:  https://example.com/café
URI:  https://example.com/caf%C3%A9

IRI:  https://example.com/search?q=España
URI:  https://example.com/search?q=Espa%C3%B1a

Nombres de dominio internacionalizados (IDN)

Los nombres de dominio con caracteres no ASCII usan codificación Punycode:

Unicode:  https://españa.es
Punycode: https://xn--espaa-rta.es

Problemas comunes y soluciones

Problema 1: Doble codificación

La doble codificación ocurre cuando una URL ya codificada se codifica nuevamente:

Original:         hola mundo
Primera codificación: hola%20mundo
Doble codificación:   hola%2520mundo  (%25 es la codificación de %)

Solución: Verificar si la entrada ya está codificada antes de codificarla:

function safeEncodeURIComponent(str) {
  try {
    const decoded = decodeURIComponent(str);
    if (decoded !== str) {
      return str; // Ya codificado
    }
  } catch (e) {
    // La decodificación falló -- codificar de nuevo
  }
  return encodeURIComponent(str);
}

Problema 2: Codificar toda la URL en lugar de componentes

// INCORRECTO: Codificar toda la URL
const url = 'https://api.example.com/search?q=hola mundo';
const encoded = encodeURIComponent(url);
// "https%3A%2F%2Fapi.example.com%2Fsearch%3Fq%3Dhola%20mundo"
// ¡Esto es completamente inservible como URL!

// CORRECTO: Codificar solo el componente que lo necesita
const baseUrl = 'https://api.example.com/search';
const query = encodeURIComponent('hola mundo');
const correctUrl = `${baseUrl}?q=${query}`;
// "https://api.example.com/search?q=hola%20mundo"

Problema 3: No codificar caracteres especiales en parámetros API

// Bug: & en el valor rompe la cadena de consulta
const apiUrl = `https://api.example.com/search?q=Tom & Jerry&page=1`;
// Esto crea TRES parámetros: q=Tom, Jerry, page=1

// Solución: Codificar el valor del parámetro
const apiUrl = `https://api.example.com/search?q=${encodeURIComponent('Tom & Jerry')}&page=1`;
// Correcto: q=Tom%20%26%20Jerry&page=1

Tabla de referencia de codificación de URL

CarácterDecimalHexCodificadoDescripción
(espacio)3220%20Carácter espacio
!3321%21Signo de exclamación
"3422%22Comilla doble
#3523%23Numeral / delimitador de fragmento
$3624%24Signo de dólar
%3725%25Signo de porcentaje (carácter de escape)
&3826%26Ampersand / delimitador de consulta
/472F%2FBarra diagonal / delimitador de ruta
:583A%3ADos puntos
=613D%3DSigno igual
?633F%3FSigno de interrogación
@6440%40Arroba

Conclusión

La codificación de URL es un concepto fundamental en el desarrollo web que afecta a toda aplicación que trabaja con URL. Entender cómo funciona la codificación porcentual, cuándo usar encodeURIComponent versus encodeURI, y cómo diferentes lenguajes de programación manejan la codificación de URL te salvará de bugs sutiles y problemas de seguridad.

Puntos clave:

  1. encodeURIComponent para valores, encodeURI para URL completas en JavaScript
  2. Los espacios pueden ser %20 o +%20 siempre es seguro
  3. Los caracteres no ASCII usan UTF-8 antes de la codificación porcentual
  4. Cuidado con la doble codificación — el error de codificación de URL más común
  5. Usar URLSearchParams en JavaScript para construir cadenas de consulta de forma segura
  6. Siempre codificar la entrada del usuario antes de incluirla en URL

Para codificación y decodificación rápida de URL, marca como favorito nuestra herramienta Codificador/Decodificador de URL.

Recursos relacionados

Preguntas Frecuentes

D

Sobre el autor

Daniel Park

Senior frontend engineer based in Seoul. Seven years of experience building web applications at Korean SaaS companies, with a focus on developer tooling, web performance, and privacy-first architecture. Open-source contributor to the JavaScript ecosystem and founder of ToolPal.

Saber más

Compartir

XLinkedIn

Publicaciones relacionadas