Pourquoi encoder une URL ?
Les URL sont normées par la RFC 3986 et ne peuvent contenir que des caractères ASCII non-réservés (lettres, chiffres, et quelques signes : - _ . ~). Tous les autres — espaces, accents, &, ?, /, etc. — doivent être encodés en séquences %XX où XX est la valeur hexadécimale de l'octet UTF-8.
encodeURIComponent vs encodeURI
| Fonction | Encode | Quand l'utiliser |
|---|---|---|
encodeURIComponent | Tout sauf A-Z, a-z, 0-9, - _ . ! ~ * ' ( ) | Fragment de paramètre (valeur après =) |
encodeURI | Idem + préserve / : ? & # = + | URL complète, en préservant sa structure |
Exemple. URL avec paramètre contenant un & :?query=tom&jerry. Si on encode tout le paramètre avec encodeURIComponent, on obtient tom%26jerry — correct. Avec encodeURI, on obtient tom&jerry — bug, le serveur croit qu'il y a deux paramètres.
Table de référence
| Caractère | Encodage |
|---|---|
| Espace | %20 |
| é | %C3%A9 (UTF-8 sur 2 octets) |
| € | %E2%82%AC |
| & | %26 |
| = | %3D |
| ? | %3F |
| # | %23 |
| / | %2F |
%20 vs + (application/x-www-form-urlencoded)
Dans le corps d'un formulaire HTML (envoyé en POST avec Content-Type: application/x-www-form-urlencoded), l'espace est traditionnellement encodé en + et non en %20. Cette convention vient des formulaires de 1993. Aujourd'hui, %20 est accepté partout, mais + reste utilisé en query string par défaut côté serveur.
Pièges courants
- Double-encodage :
%20ré-encodé devient%2520. À éviter ! - Confusion entre URL et query body : espace =
%20ou+selon contexte. - Caractères Unicode : 1 caractère peut être encodé sur plusieurs octets (chaque octet = %XX).
- Slash dans une clé d'API :
encodeURIComponentobligatoire pour éviter l'interprétation comme segment d'URL.
Questions fréquentes
encodeURIComponent ou encodeURI ?
Component pour un paramètre, URI pour une URL complète.
Espace = %20 ou + ?
%20 dans une URL, + dans un body de formulaire. %20 toujours accepté.
Accents encodés ?
Oui, en UTF-8 (é = %C3%A9). Les ASCII purs ne sont jamais touchés.
Double-encodage ?
Erreur. Décoder avant ré-encoder si doute.
Caractères jamais encodés ?
A-Z, a-z, 0-9, - _ . ~
Outils complémentaires
Sources
- RFC 3986 — Uniform Resource Identifier syntax
- MDN — encodeURIComponent (developer.mozilla.org)
- WHATWG URL Standard (url.spec.whatwg.org)