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 GET
parametri ( &
, +
, 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@home
non invierà correttamente il secondo @
al server, ad eccezione del tuo browser che gestisce la compatibilità (come naturalmente fa spesso Chrome).