Guía
Espacios en URL: diferencia entre %20 y +
Aprende cuándo un espacio se representa como %20 o como +, cómo conservar un signo más literal y qué codificación usa cada contexto.
por Tools in a Tab · Publicado el · Actualizada
Respuesta breve
%20 representa un espacio mediante percent-encoding en una URL. El signo +
representa un espacio específicamente en datos codificados como
application/x-www-form-urlencoded, usados a menudo en consultas y
formularios. Fuera de ese formato, + puede ser un signo más literal. Si
necesitas conservarlo dentro de datos de formulario, codifícalo como %2B.
Tres entradas, tres significados
Supón que quieres transportar estos valores:
| Valor original | Percent-encoding de componente | Formulario URL-encoded |
|---|---|---|
café solo |
caf%C3%A9%20solo |
caf%C3%A9+solo |
a+b |
a%2Bb |
a%2Bb |
a b |
a%20b |
a+b |
El problema aparece cuando se descodifica a+b con reglas de formulario: se
obtiene a b, no el signo más original. Por eso un + que forma parte del dato
debe llegar como %2B en ese contexto.
Qué regla aplica cada API
encodeURIComponent("a b") devuelve a%20b. En cambio,
URLSearchParams serializa espacios como + porque utiliza el formato de
formulario. Ambos resultados pueden ser correctos; responden a algoritmos y
contextos diferentes.
La sección de percent-encoding del RFC 3986
define la forma %HH. El estándar URL de WHATWG
define el algoritmo application/x-www-form-urlencoded que transforma el
espacio en +.
Qué hace la herramienta
El codificador y decodificador URL de Tools in a Tab ofrece tres modos explícitos. Elige el modo antes de transformar:
| Modo | Codificar a b |
Decodificar a+b |
|---|---|---|
| Componente | a%20b |
a+b |
| URL o ruta completa | a%20b |
a+b |
| Valor de formulario / query | a+b |
a b |
El modo de URL completa conserva los delimitadores estructurales; usa componente para un solo segmento o valor. El modo formulario trata un valor, no el cuerpo entero. Para construir varios parámetros, usa el analizador de query strings, que conserva por separado nombres, valores y apariciones repetidas.
Conservar un signo más literal con URLSearchParams
Pasa el valor sin codificar a set en lugar de interpolarlo en una consulta:
const params = new URLSearchParams();
params.set('q', 'a+b c');
params.toString(); // 'q=a%2Bb+c'
params.get('q'); // 'a+b c'
En cambio, new URLSearchParams('q=a+b').get('q') devuelve a b:
el constructor con cadena analiza datos de formulario. No codifiques antes el
valor enviado a set: un %2B existente se convertiría en %252B. Los
ejemplos de URLSearchParams en MDN
explican esta diferencia.
Regla práctica
- Identifica si codificas un componente de URL o datos de formulario.
- Para componentes, espera
%20para el espacio. - En formulario URL-encoded, espera
+para el espacio. - Representa siempre un signo más literal como
%2Bcuando el receptor aplique reglas de formulario.
No reemplaces todos los + por espacios sin conocer el formato: esa sustitución
puede cambiar un dato legítimo.