Vous ne devriez pas utiliser encodeURIComponent()
ou encodeURI()
. Vous devez utiliser fixedEncodeURIComponent()
et fixedEncodeURI()
, conformément à la documentation MDN.
Concernant encodeURI()
...
Si l'on souhaite suivre la RFC3986 plus récente pour les URL, qui rend les crochets réservés (pour IPv6) et donc non codés lors de la formation de quelque chose qui pourrait faire partie d'une URL (comme un hôte), l'extrait de code suivant peut aider:
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
Concernant encodeURIComponent()
...
Pour être plus strict dans le respect de la RFC 3986 (qui réserve!, ', (,) Et *), même si ces caractères n'ont pas d'utilisation formalisée de délimitation d'URI, les éléments suivants peuvent être utilisés en toute sécurité:
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
Alors, quelle est la difference? fixedEncodeURI()
et fixedEncodeURIComponent()
convertir le même ensemble de valeurs, mais fixedEncodeURIComponent()
convertit également cet ensemble: +@?=:*#;,$&
. Cet ensemble est utilisé dans les GET
paramètres ( &
, +
, etc.), les balises d'ancrage ( #
), les balises génériques ( *
), pièces e - mail / nom d' utilisateur ( @
), etc ..
Par exemple - Si vous utilisez encodeURI()
, user@example.com/?email=me@home
n'enverra pas correctement le second @
au serveur, sauf pour votre navigateur gérant la compatibilité (comme Chrome le fait naturellement souvent).