DevToolBoxGRATIS
Blog

Codificación y Decodificación URL: Guía Completa de Percent-Encoding

10 min de lecturapor DevToolBox

La codificacion URL (tambien conocida como codificacion porcentual) es uno de los mecanismos mas esenciales del desarrollo web. Cada vez que envias un formulario, haces clic en un enlace con parametros o llamas a una API REST, se realizan operaciones de codificacion y decodificacion URL. Esta guia completa cubre desde la especificacion RFC 3986 hasta ejemplos de codigo practicos en JavaScript, Python, Bash, PHP y Java.

Prueba nuestra herramienta gratuita de codificacion/decodificacion URL en linea.

Que es la codificacion URL (codificacion porcentual)?

La codificacion URL, definida en RFC 3986, reemplaza caracteres inseguros con un signo de porcentaje (%) seguido de dos digitos hexadecimales. Por ejemplo, un espacio se convierte en %20.

Las URLs solo pueden contener un conjunto limitado de caracteres ASCII. Los caracteres seguros son: letras, digitos y cuatro caracteres especiales: -, _, ., ~. Todos los demas deben codificarse.

Caracteres como &, =, ? y # tienen significados estructurales en URLs. Sin codificacion URL, las URLs se romperian o serian malinterpretadas.

Como funciona la codificacion URL

El proceso de codificacion URL sigue un algoritmo simple:

  1. Convertir el caracter a bytes UTF-8.
  2. Para cada byte, escribir % seguido del valor hexadecimal.
  3. Caracteres no reservados permanecen sin cambios.
  4. Caracteres reservados solo se codifican cuando serian malinterpretados.

Ejemplo: Hello World! se convierte en Hello%20World%21.

Ejemplo multi-byte UTF-8: Los caracteres no ASCII producen multiples bytes codificados.

Tabla de referencia de codificacion URL

Tabla de referencia de caracteres comunmente codificados:

CharacterEncodedDescription
(space)%20Space
!%21Exclamation mark
#%23Hash / Fragment
$%24Dollar sign
%%25Percent sign
&%26Ampersand
'%27Apostrophe
(%28Left parenthesis
)%29Right parenthesis
*%2AAsterisk
+%2BPlus sign
,%2CComma
/%2FForward slash
:%3AColon
;%3BSemicolon
=%3DEquals sign
?%3FQuestion mark
@%40At sign
[%5BLeft bracket
]%5DRight bracket
{%7BLeft brace
}%7DRight brace
|%7CPipe
<%3CLess than
>%3EGreater than
"%22Double quote

Codificacion de espacios: %20 vs +

Hay dos formas de codificar espacios en URLs:

%20: Codificacion estandar RFC 3986 para URIs.

+: Usado por application/x-www-form-urlencoded (formularios HTML).

Cual usar? Usa %20 para construir URLs programaticamente. + se usa automaticamente para formularios.

// Space encoding comparison

// RFC 3986 (URI standard) — space = %20
"hello world"  →  "hello%20world"
// Used in: URL paths, API endpoints, general URIs

// application/x-www-form-urlencoded — space = +
"hello world"  →  "hello+world"
// Used in: HTML form submissions, URLSearchParams

// JavaScript comparison:
encodeURIComponent("hello world")  // "hello%20world"  (%20)
new URLSearchParams({q: "hello world"}).toString()  // "q=hello+world"  (+)

// Python comparison:
urllib.parse.quote("hello world")      # "hello%20world"  (%20)
urllib.parse.urlencode({"q": "hello world"})  # "q=hello+world"  (+)

// PHP comparison:
rawurlencode("hello world")  // "hello%20world"  (%20)
urlencode("hello world")     // "hello+world"    (+)

Ejemplos de codigo de codificacion/decodificacion URL

JavaScript codificacion/decodificacion URL

JavaScript ofrece encodeURIComponent y encodeURI. Es esencial entender cuando usar cada uno:

// ===== encodeURIComponent vs encodeURI =====

// encodeURIComponent — encodes EVERYTHING except: A-Z a-z 0-9 - _ . ~
// Use for: individual query parameter values, path segments
encodeURIComponent("hello world & goodbye");
// "hello%20world%20%26%20goodbye"

encodeURIComponent("price=100&category=books");
// "price%3D100%26category%3Dbooks"

// encodeURI — preserves URL structure characters: : / ? # & = @ + $
// Use for: encoding a complete URL
encodeURI("https://example.com/search?q=hello world&lang=en");
// "https://example.com/search?q=hello%20world&lang=en"

// WARNING: Do NOT use encodeURIComponent on full URLs!
encodeURIComponent("https://example.com/path");
// "https%3A%2F%2Fexample.com%2Fpath"  ← BROKEN URL!

// ===== Decoding =====
decodeURIComponent("hello%20world%20%26%20goodbye");
// "hello world & goodbye"

decodeURI("https://example.com/search?q=hello%20world");
// "https://example.com/search?q=hello world"

// ===== URLSearchParams (handles form encoding automatically) =====
const params = new URLSearchParams({
  query: "cats & dogs",
  page: "1",
  filter: "price > 50"
});
params.toString();
// "query=cats+%26+dogs&page=1&filter=price+%3E+50"
// Note: spaces become + (form encoding), & in values becomes %26

// Parse query string
const parsed = new URLSearchParams("?q=hello+world&lang=en");
parsed.get("q");  // "hello world" (+ decoded to space)
parsed.get("lang");  // "en"

// ===== Building URLs with the URL API =====
const url = new URL("https://api.example.com/search");
url.searchParams.set("q", "hello world & more");
url.searchParams.set("limit", "10");
url.toString();
// "https://api.example.com/search?q=hello+world+%26+more&limit=10"

Python codificacion/decodificacion URL

El modulo urllib.parse de Python proporciona funciones completas de codificacion URL:

import urllib.parse

# ===== quote / unquote (RFC 3986 percent-encoding) =====

# Encode a string (spaces become %20)
urllib.parse.quote("hello world & goodbye")
# "hello%20world%20%26%20goodbye"

# By default, / is NOT encoded (safe="/")
urllib.parse.quote("/path/to/file name.txt")
# "/path/to/file%20name.txt"

# Encode everything including /
urllib.parse.quote("/path/to/file", safe="")
# "%2Fpath%2Fto%2Ffile"

# Decode
urllib.parse.unquote("hello%20world%20%26%20goodbye")
# "hello world & goodbye"

# ===== urlencode (for query strings, uses + for spaces) =====
params = {"q": "cats & dogs", "page": 1, "filter": "price > 50"}
urllib.parse.urlencode(params)
# "q=cats+%26+dogs&page=1&filter=price+%3E+50"

# ===== quote_plus (form encoding, spaces become +) =====
urllib.parse.quote_plus("hello world")
# "hello+world"

urllib.parse.unquote_plus("hello+world")
# "hello world"

# ===== With the requests library =====
import requests

# requests handles URL encoding automatically
response = requests.get(
    "https://api.example.com/search",
    params={"q": "hello world", "lang": "en"}
)
# Actual URL: https://api.example.com/search?q=hello+world&lang=en

# For path segments, encode manually
username = "john@example.com"
url = f"https://api.example.com/users/{urllib.parse.quote(username, safe='')}"
# "https://api.example.com/users/john%40example.com"

Bash / curl codificacion URL

Con curl, el flag --data-urlencode es el enfoque mas simple:

# ===== curl --data-urlencode =====

# GET request with URL-encoded query parameter
curl -G "https://api.example.com/search" \
  --data-urlencode "q=hello world & more" \
  --data-urlencode "lang=en"
# Request URL: /search?q=hello%20world%20%26%20more&lang=en

# POST with form-encoded body
curl -X POST "https://api.example.com/submit" \
  --data-urlencode "name=John Doe" \
  --data-urlencode "message=Hello! How are you?"

# ===== Pure Bash URL encoding (using printf) =====
urlencode() {
  local string="${1}"
  local strlen=${#string}
  local encoded=""
  local pos c o
  for (( pos=0 ; pos<strlen ; pos++ )); do
    c=${string:$pos:1}
    case "$c" in
      [-_.~a-zA-Z0-9]) o="${c}" ;;
      *) printf -v o '%%%02X' "'$c" ;;
    esac
    encoded+="${o}"
  done
  echo "${encoded}"
}

urlencode "hello world & goodbye"
# "hello%20world%20%26%20goodbye"

# ===== Using Python one-liner in Bash =====
python3 -c "import urllib.parse; print(urllib.parse.quote('hello world'))"
# "hello%20world"

# ===== Decode URL-encoded strings =====
python3 -c "import urllib.parse; print(urllib.parse.unquote('hello%20world'))"
# "hello world"

PHP codificacion/decodificacion URL

PHP proporciona urlencode() y rawurlencode():

<?php
// ===== urlencode / urldecode =====
// Uses + for spaces (application/x-www-form-urlencoded)

echo urlencode("hello world & goodbye");
// "hello+world+%26+goodbye"

echo urldecode("hello+world+%26+goodbye");
// "hello world & goodbye"

// ===== rawurlencode / rawurldecode =====
// Uses %20 for spaces (RFC 3986)

echo rawurlencode("hello world & goodbye");
// "hello%20world%20%26%20goodbye"

echo rawurldecode("hello%20world%20%26%20goodbye");
// "hello world & goodbye"

// ===== When to use which? =====
// urlencode()    → for query string values (form-style)
// rawurlencode() → for URL path segments (RFC 3986)

// Building a URL with encoded path and query
$path = rawurlencode("my file.pdf");
$query = urlencode("search term & more");
$url = "https://example.com/files/{$path}?q={$query}";
// "https://example.com/files/my%20file.pdf?q=search+term+%26+more"

// ===== http_build_query (encode arrays as query strings) =====
$params = [
    "q" => "cats & dogs",
    "page" => 1,
    "tags" => ["php", "url encoding"]
];
echo http_build_query($params);
// "q=cats+%26+dogs&page=1&tags%5B0%5D=php&tags%5B1%5D=url+encoding"
?>

Java codificacion/decodificacion URL

Las clases URLEncoder y URLDecoder de Java manejan la codificacion URL:

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

// ===== URLEncoder.encode (uses + for spaces) =====

// Always specify UTF-8 charset!
String encoded = URLEncoder.encode(
    "hello world & goodbye", StandardCharsets.UTF_8
);
// "hello+world+%26+goodbye"

// Decode
String decoded = URLDecoder.decode(
    "hello+world+%26+goodbye", StandardCharsets.UTF_8
);
// "hello world & goodbye"

// ===== Convert + to %20 for RFC 3986 compliance =====
String rfc3986 = URLEncoder.encode("hello world", StandardCharsets.UTF_8)
    .replace("+", "%20");
// "hello%20world"

// ===== Java 11+ URI encoding =====
import java.net.URI;

URI uri = URI.create("https://example.com/search");
// For building URLs with encoded parameters:
String query = "q=" + URLEncoder.encode("hello world", StandardCharsets.UTF_8);
URI fullUri = URI.create("https://example.com/search?" + query);
// https://example.com/search?q=hello+world

// ===== Encoding path segments =====
String pathSegment = URLEncoder.encode("my file.pdf", StandardCharsets.UTF_8)
    .replace("+", "%20");
String url = "https://example.com/files/" + pathSegment;
// "https://example.com/files/my%20file.pdf"

Errores comunes de codificacion URL

Las trampas mas comunes a evitar:

Doble codificacion: Codificar una cadena ya codificada. %20 se convierte en %2520.

// Double encoding example — a common bug!

const value = "hello world";

// Correct: encode once
const correct = encodeURIComponent(value);
// "hello%20world" ✓

// Bug: encode twice
const doubleEncoded = encodeURIComponent(encodeURIComponent(value));
// "hello%2520world" ✗  (%25 is the encoded form of %)

// How to detect double encoding:
// If you see %25 in your URLs, you likely have a double encoding issue
// %2520 = double-encoded space (%25 = %, 20 = space)
// %253A = double-encoded colon (%25 = %, 3A = :)

Codificar la URL completa: Usar encodeURIComponent() en una URL completa rompe su estructura.

// Encoding the entire URL — WRONG!
const url = "https://example.com/path?q=hello world";

// WRONG: breaks URL structure
encodeURIComponent(url);
// "https%3A%2F%2Fexample.com%2Fpath%3Fq%3Dhello%20world"

// CORRECT option 1: use encodeURI for full URLs
encodeURI(url);
// "https://example.com/path?q=hello%20world"

// CORRECT option 2: encode only the value
const base = "https://example.com/path";
const query = encodeURIComponent("hello world");
const fullUrl = base + "?q=" + query;
// "https://example.com/path?q=hello%20world"

Olvidar UTF-8: Siempre usa UTF-8 para codificacion URL.

No codificar segmentos de ruta: Las rutas con espacios tambien deben codificarse.

Mal manejo del signo +: + significa espacio en formularios, pero es literal en URLs.

Codificacion URL en APIs

La codificacion URL correcta es crucial para las APIs:

Parametros de consulta: Cada nombre y valor debe codificarse individualmente.

Parametros de ruta: Los valores en rutas de URL tambien deben codificarse.

Datos de formulario: application/x-www-form-urlencoded usa + para espacios.

Cargas JSON: El contenido JSON en el cuerpo de la solicitud no necesita codificacion URL.

// API URL encoding examples

// Query parameters — encode each value individually
const searchTerm = 'price > 100 & category = "electronics"';
const apiUrl = `https://api.example.com/search?q=${encodeURIComponent(searchTerm)}&limit=10`;
// "https://api.example.com/search?q=price%20%3E%20100%20%26%20...&limit=10"

// Path parameters — encode values embedded in paths
const username = "john@example.com";
const profileUrl = `https://api.example.com/users/${encodeURIComponent(username)}/profile`;
// "https://api.example.com/users/john%40example.com/profile"

// Form data (POST) — uses + for spaces
const formBody = new URLSearchParams({
  username: "john doe",
  password: "p@ss w0rd!"
}).toString();
// "username=john+doe&password=p%40ss+w0rd%21"

// JSON as query parameter — encode the entire JSON string
const filters = JSON.stringify({ price: { min: 10, max: 100 } });
const url = `/api/products?filters=${encodeURIComponent(filters)}`;
// "/api/products?filters=%7B%22price%22%3A%7B%22min%22%3A10%2C%22max%22%3A100%7D%7D"

Preguntas frecuentes

Que es la codificacion URL y por que se necesita?

La codificacion URL reemplaza caracteres inseguros con secuencias porcentaje-hexadecimal para transmision segura en URLs. Caracteres como &, =, ? y # tienen significados estructurales y deben codificarse como datos.

Cual es la diferencia entre encodeURI y encodeURIComponent?

encodeURI() preserva caracteres estructurales (:, /, ?, #). encodeURIComponent() codifica todo excepto caracteres no reservados. Usa encodeURIComponent para valores de parametros individuales.

Debo usar %20 o + para espacios?

Usa %20 para URLs (RFC 3986). Usa + solo para application/x-www-form-urlencoded. En caso de duda, %20 es la opcion mas segura.

La codificacion URL es una habilidad fundamental del desarrollo web. Usa nuestra herramienta gratuita para codificar y decodificar al instante.

Codifica y decodifica URLs al instante con nuestra herramienta gratuita en linea.

𝕏 Twitterin LinkedIn
¿Fue útil?

Mantente actualizado

Recibe consejos de desarrollo y nuevas herramientas.

Sin spam. Cancela cuando quieras.

Prueba estas herramientas relacionadas

%20URL Encoder/Decoder🔗URL Parser%←URL Decoder%%Percent Encoding Tool

Artículos relacionados

Codificación URL de caracteres especiales: Tabla de referencia completa

Referencia completa de percent-encoding URL. Tabla de búsqueda, encodeURIComponent vs encodeURI, errores comunes.

Codificación y Decodificación Base64: Guía Completa con Ejemplos de Código

Codificador y decodificador Base64 gratuito online. Aprende cómo funciona Base64 con ejemplos en JavaScript, Python, Bash y PowerShell.

Guia URL Encoder Decoder Online: Codificacion Porcentual, RFC 3986 y Mejores Practicas

Guia completa de codificacion URL (codificacion porcentual). RFC 3986, encodeURIComponent vs encodeURI, Python urllib.parse, Java URLEncoder, caracteres codificados comunes, codificacion de formularios, parametros de consulta API.