¿Por qué hay que codificar una URL?
Una URL solo puede llevar unos pocos caracteres: letras sin tilde, números y algunos signos. Otros, como ?, &, = o #, tienen un significado especial: separan la ruta, los parámetros y sus valores. Y los espacios, las tildes o la ñ, directamente, no están permitidos.
Para usarlos hay que codificarlos (en inglés, percent-encoding o URL encoding): cada carácter se convierte en sus bytes en UTF-8 y cada byte se escribe como % seguido de su valor en hexadecimal. Por ejemplo:
- un espacio es
%20, - la ñ es
%C3%B1, porque en UTF-8 ocupa dos bytes, - la é es
%C3%A9, - y el
&dentro de un valor es%26, para que no se confunda con el separador de parámetros.
¿Parámetro o URL completa?
Si vas a codificar el valor de un parámetro, por ejemplo lo que alguien escribe en un buscador, hay que codificarlo todo, incluidos /, ? y &: es lo que hace encodeURIComponent en JavaScript o rawurlencode en PHP.
Si vas a codificar una URL entera, esos signos hay que dejarlos como están, porque son los que dan forma a la URL: solo se codifican los espacios, las tildes y el resto de caracteres no permitidos. Es lo que hace encodeURI.
¿%20 o +?
Los dos significan un espacio, pero en sitios distintos. %20 vale en cualquier parte de la URL. El + solo significa espacio en los parámetros enviados por un formulario (application/x-www-form-urlencoded), que es como lo codifica, por ejemplo, urlencode en PHP. En la ruta de una URL, un + es un signo más.