Para codificar una URL (URL encode) hay que sustituir cada carácter que no sea una letra sin tilde, un número o uno de - . _ ~ por un % seguido del valor hexadecimal de cada uno de sus bytes en UTF-8. Un espacio pasa a ser %20 (o + dentro de la query), & pasa a %26 y la ñ se convierte en %C3%B1. Lo más rápido es pegar el texto en nuestro codificador de URL gratis y copiar el resultado: es gratis, no pide cuenta y funciona en cualquier navegador. Lo difícil es saber qué codificar y qué variante espera el sitio donde vas a pegarlo, y de eso trata casi toda esta guía.
Todos los resultados que verás son reales: pasamos las entradas por las herramientas de My Botsy en producción el 1 de noviembre de 2026 y las comparamos con JavaScript (Node.js 24), Python 3.13 y PHP usando las mismas cadenas.
Cómo codificar una URL paso a paso
- Aísla el valor. Codifica solo el dato que va dentro de la URL: un término de búsqueda, un nombre de archivo o una dirección de redirección. Nunca la dirección completa (lo explicamos más abajo).
- Pégalo en el codificador. Abre el codificador de URL, pega el valor y pulsa Enviar.
- Copia el resultado. Usa el botón de copiar. Los espacios salen como
+, que es lo correcto en una query string. - Cambia a %20 si va en la ruta. Si el valor forma parte de la ruta (antes del
?), reemplaza cada+por%20. Es seguro, porque un signo más real de tu texto ya viene codificado como%2B. - Compruébalo. Pega el enlace final en el analizador de URL: decodifica cada parámetro y te muestra exactamente lo que recibirá el servidor.
Pruébalo ahora: pega cualquier texto con espacios, tildes o un & en el codificador de URL gratis y tendrás una versión segura para enlaces en un segundo.
Qué caracteres hay que codificar
El RFC 3986, el estándar que define las URL, divide los caracteres en tres grupos:
- No reservados, nunca se codifican:
A–Z a–z 0–9 - . _ ~. Ojo: lañy las vocales con tilde no están en esta lista. - Reservados, tienen una función en la URL:
: / ? # [ ] @ ! $ & ' ( ) * + , ; =. Hay que codificarlos cuando son parte de tus datos y no de la estructura. Un&sin codificar en una búsqueda abre un parámetro nuevo y corta tu valor por la mitad. - Todo lo demás: espacios, comillas,
< >,%, letras con tilde, emojis y cualquier alfabeto no latino. Siempre se codifican, byte a byte, a partir de UTF-8. Por esojamón y quesoqueda comojam%C3%B3n+y+quesoyaño 2026comoa%C3%B1o+2026.
Prueba real: una cadena llena de trampas
Usamos a propósito una entrada difícil, con casi todos los problemas posibles:
Café & Bar #1 / 50% off? a+b=c ~ü 東京 Tom's "best" <b>
El codificador de URL devolvió:
Caf%C3%A9+%26+Bar+%231+%2F+50%25+off%3F+a%2Bb%3Dc+%7E%C3%BC+%E6%9D%B1%E4%BA%AC+Tom%27s+%22best%22+%3Cb%3E
| Entrada | Salida | Por qué importa |
|---|---|---|
| espacio | + | Formato de formulario, válido en la query |
& | %26 | Si no, empezaría un parámetro nuevo |
# | %23 | Si no, todo lo que sigue sería un fragmento que el servidor nunca ve |
% | %25 | Si no, 50% o se leería como un escape roto |
+ | %2B | Si no, el servidor lo lee como un espacio |
é, ü | %C3%A9, %C3%BC | Dos bytes UTF-8 cada uno |
~ | %7E | Innecesario pero inofensivo: los servidores aceptan ambas formas |
' " < > | %27 %22 %3C %3E | Se conservan como datos, no se borran |
Ese resultado es idéntico, byte a byte, al que genera URLSearchParams en el navegador para el mismo texto, y al de la función urlencode() de PHP, que es la que usa la herramienta. Un valor codificado aquí se comporta igual que uno enviado por un formulario web.
¿%20 o +? Cuál usar para los espacios
Los dos significan «espacio», pero en sitios distintos. %20 es la codificación porcentual general del RFC 3986 y vale en cualquier parte de la URL. + viene del formato de formularios HTML (application/x-www-form-urlencoded) y solo equivale a un espacio dentro de la query string. En la ruta, un + es un signo más literal: /archivos/mi+informe.pdf pide un archivo con un más en el nombre.
- Valores de la query (
?q=jam%C3%B3n+y+queso):+o%20, los dos funcionan. - Segmentos de ruta (
/docs/mi%20informe): solo%20. - Enlaces
mailto::%20. El estándar de mailto (RFC 6068) pide escribir los espacios como%20, porque un+no se distingue de un más real, como enana+boletin@example.org. Por eso nuestro generador de enlaces mailto usa%20; lo explicamos en la guía de enlaces mailto.
Qué función usar en tu código
Pasamos la misma cadena de prueba por las funciones más comunes. No coinciden en cuatro cosas: el espacio, /, ~ y '.
| Función | Espacio | / | ~ | ' | ¿Deja & # ? sin codificar? |
|---|---|---|---|---|---|
JS encodeURIComponent | %20 | %2F | ~ | ' | No |
JS encodeURI | %20 | / | ~ | ' | Sí |
JS URLSearchParams | + | %2F | %7E | %27 | No |
Python quote() | %20 | / | ~ | %27 | No |
Python quote_plus() | + | %2F | ~ | %27 | No |
PHP rawurlencode() | %20 | %2F | ~ | %27 | No |
PHP urlencode() / nuestra herramienta | + | %2F | %7E | %27 | No |
Dos de ellas suelen dar sustos. encodeURI está pensada para una URL completa, así que no toca &, #, ?, = ni +; aplicada a un valor, Café & Bar #1 queda como Caf%C3%A9%20&%20Bar%20#1 y el enlace se rompe en el & y en el #. El quote() de Python conserva la / por defecto, así que una redirección como /carrito?id=7 mantiene la barra si no pasas safe=''. Para un valor suelto, usa encodeURIComponent, quote(valor, safe='') o rawurlencode.
Ejemplo práctico: una URL dentro de otra URL
Una página de login tiene que devolver al usuario a /cart?id=7. Si escribes /login?next=/cart?id=7, el segundo ? y cualquier & posterior confunden al servidor. Codifica primero la URL interior:
/login?next=%2Fcart%3Fid%3D7
Para comprobar un enlace terminado, pegamos https://shop.example/search?q=caf%C3%A9+%26+bar&next=%2Fcart%3Fid%3D7 en el analizador de URL. Mostró la query en bruto y luego los parámetros decodificados, tal como los recibe el servidor:
{ "q": "café & bar", "next": "/cart?id=7" }
Dos valores limpios y ningún parámetro de más. Los enlaces de campaña funcionan igual: cada valor UTM es un parámetro, así que codifícalo o, mejor aún, limítate a minúsculas y guiones bajos, como recomienda nuestra guía de parámetros UTM.
Errores habituales al codificar URLs
Codificar la URL entera
Codificar https://mybotsy.com/?q=zapatos rojos da https%3A%2F%2Fmybotsy.com%2F%3Fq%3Dzapatos+rojos, que ya no funciona como enlace. Solo es correcto cuando la URL completa es a su vez el valor de un parámetro, como en la redirección de arriba.
Codificar dos veces
Si vuelves a codificar un texto ya codificado, se codifican los signos de porcentaje. Probamos a%20b y obtuvimos a%2520b. Si ves %25 seguido de dos dígitos hexadecimales en un enlace, está doblemente codificado. Decodificar %25252F requiere tres pasadas para llegar a / (%252F, luego %2F, luego /).
Perder un signo más al decodificar
Los decodificadores de tipo formulario, incluido nuestro decodificador de URL, convierten + en espacio. Decodificamos q=mac+cheese&phone=%2B54+11+5555&path=%2Fdocs%2520v2 y salió q=mac cheese&phone=+54 11 5555&path=/docs%20v2. El prefijo telefónico solo sobrevivió porque su más estaba escrito como %2B; un +34 sin codificar se habría convertido en un espacio. Lo mismo estropea los valores Base64 en URLs: mira cómo decodificar Base64 para conocer el alfabeto seguro para URLs que lo evita.
Mezclar escapes Latin-1 antiguos con UTF-8
Algunos sistemas viejos codifican é como %E9 (un byte Latin-1) en lugar de %C3%A9. Al decodificarlo como UTF-8, caf%E9 aparece como caf�. Si ves el carácter de reemplazo, el origen usaba una codificación antigua; pasa a menudo con la ñ en webs y formularios antiguos.
Fiarse del recorte automático
Nuestro codificador recorta los espacios del principio y del final: " hello world" + salto de línea + "line 2 " salió como hello+world%0D%0Aline+2. Suele ser lo que quieres, pero si un espacio inicial importa, añade %20 a mano. Un salto de línea escrito en el navegador se convierte en %0D%0A.
Un % suelto en JavaScript
decodeURIComponent("50%") lanza URIError: URI malformed. Nuestro decodificador deja el % suelto tal cual (50% off sigue siendo 50% off): práctico con datos sucios, pero tampoco te avisa.
Herramientas gratis relacionadas
- Decodificador de URL: convierte
%20,%26y%C3%B1de nuevo en texto. - Analizador de URL: separa host, ruta y parámetros decodificados.
- Generador de enlaces UTM: crea enlaces de campaña con los valores ya codificados.
- Generador de enlaces de WhatsApp: enlaces wa.me con mensaje predefinido (ver nuestra guía de enlaces de WhatsApp).
- Generador de slugs: si controlas la URL, un slug limpio evita tener que codificar (cómo crear un slug SEO).
Todas son gratis y no piden cuenta. Los visitantes tienen 5 usos al día, y una cuenta gratuita de My Botsy (100 % gratis, sin spam) elimina ese límite.
Preguntas frecuentes
¿Qué es codificar una URL?
Codificar una URL, o codificación porcentual, sustituye los caracteres que no están permitidos o que tienen un significado especial por un signo % y el valor hexadecimal de cada byte. Un espacio pasa a %20, & a %26 y la ñ a %C3%B1, sus dos bytes UTF-8.
¿Un espacio en una URL es %20 o +?
Dentro de la query string valen los dos, porque + es la forma de formulario de escribir un espacio. En la ruta o en un enlace mailto usa %20, porque ahí + es un signo más literal. Nuestro codificador devuelve +, así que cámbialo por %20 si va en la ruta.
¿Qué caracteres no hace falta codificar?
Solo las letras de la A a la Z sin tilde, los dígitos del 0 al 9 y los símbolos - . _ ~. Los reservados como & ? # = / + : se codifican cuando forman parte del dato, y todo lo demás (espacios, comillas, tildes, ñ, emojis) se codifica siempre.
¿Qué diferencia hay entre encodeURI y encodeURIComponent?
encodeURI es para una URL completa y no toca caracteres estructurales como & # ? = y /. encodeURIComponent es para un valor suelto y sí los codifica. Usar encodeURI en un término de búsqueda o una redirección rompe el enlace en el primer & o #.
¿Por qué mi enlace muestra %2520?
Se codificó dos veces: la primera pasada convirtió el espacio en %20 y la segunda convirtió el % en %25. Decodifícalo una vez y codifica el texto original una sola vez.
¿El codificador de URL es gratis?
Sí. El codificador de URL de My Botsy es gratis, no pide cuenta y funciona en cualquier navegador. Los visitantes tienen 5 usos al día, y una cuenta gratuita elimina el límite.
¿Tienes un valor que meter en un enlace? Pégalo en el codificador de URL gratis, copia el resultado y revisa el enlace final con el analizador de URL.