No deberías usar encodeURIComponent()
o encodeURI()
. Debe utilizar fixedEncodeURIComponent()
y fixedEncodeURI()
, de acuerdo con la documentación de MDN.
Respecto a encodeURI()
...
Si uno desea seguir el RFC3986 más reciente para URL, que hace que los corchetes estén reservados (para IPv6) y, por lo tanto, no se codifiquen cuando se forma algo que podría ser parte de una URL (como un host), el siguiente fragmento de código puede ayudar:
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
Respecto a encodeURIComponent()
...
Para ser más estrictos al adherirse a RFC 3986 (que reserva!, ', (,) Y *), aunque estos caracteres no tienen usos formalizados de delimitación de URI, lo siguiente se puede usar de manera segura:
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
¿Entonces cuál es la diferencia? fixedEncodeURI()
y fixedEncodeURIComponent()
convertir el mismo conjunto de valores, pero fixedEncodeURIComponent()
también convierte este conjunto: +@?=:*#;,$&
. Este conjunto se utiliza en GET
los parámetros ( &
, +
, etc.), las etiquetas de anclaje ( #
), etiquetas de comodines ( *
), piezas de correo electrónico / nombre de usuario ( @
), etc ..
Por ejemplo: si lo usa encodeURI()
, user@example.com/?email=me@home
no enviará correctamente el segundo @
al servidor, a excepción de que su navegador maneje la compatibilidad (como Chrome, naturalmente, lo hace a menudo).