Non dovresti usare encodeURIComponent()o encodeURI(). Dovresti usare fixedEncodeURIComponent()e fixedEncodeURI(), secondo la documentazione MDN.
Per quanto riguarda encodeURI()...
Se si desidera seguire la più recente RFC3986 per gli URL, che rende le parentesi quadre riservate (per IPv6) e quindi non codificate quando si forma qualcosa che potrebbe essere parte di un URL (come un host), il seguente frammento di codice può aiutare:
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
Per quanto riguarda encodeURIComponent()...
Per essere più rigorosi nell'adesione alla RFC 3986 (che riserva!, ', (,) E *), anche se questi caratteri non hanno usi di delimitazione URI formalizzati, si può tranquillamente usare quanto segue:
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
Allora, qual è la differenza? fixedEncodeURI()e fixedEncodeURIComponent()convertire lo stesso insieme di valori, ma fixedEncodeURIComponent()converte anche questo set: +@?=:*#;,$&. Questo set è usato in GETparametri ( &, +, ecc), i tag di ancoraggio ( #), i tag jolly ( *), parti di e-mail / nome utente ( @), ecc ..
Ad esempio: se utilizzi encodeURI(), user@example.com/?email=me@homenon invierà correttamente il secondo @al server, ad eccezione del tuo browser che gestisce la compatibilità (come naturalmente fa spesso Chrome).