Comment utiliser l’encodeur et décodeur d’URL
- Choisissez Encoder ou Décoder.
- Sélectionnez un mode : composant pour une valeur de requête ou un segment de chemin isolé, ou URL complète pour conserver intacte la structure de l’URL (
:,/,?,&). - Collez votre texte ou votre URL et copiez le résultat.
Tout est traité dans votre navigateur. Les URL contiennent souvent des jetons et des données personnelles dans leurs chaînes de requête, et rien de tout cela n’est envoyé ni stocké.
Qu’est-ce que l’encodage en pourcentage ?
Les URL ne peuvent contenir qu’un ensemble limité de caractères ASCII. L’encodage en pourcentage, défini par la RFC 3986, représente tout autre octet par un signe pourcentage suivi de deux chiffres hexadécimaux. Le texte est d’abord converti en octets UTF-8, puis chaque octet qui doit être échappé est écrit sous la forme %XX :
café & crème → caf%C3%A9%20%26%20cr%C3%A8me
Ici, é correspond à deux octets UTF-8 (C3 A9), l’espace devient %20 et l’esperluette devient %26.
Caractères réservés et non réservés
| Groupe | Caractères | Signification |
|---|---|---|
| Non réservés | A–Z a–z 0–9 - . _ ~ | N’ont jamais besoin d’être encodés. |
| Réservés : gen-delims | : / ? # [ ] @ | Séparent les principales parties d’une URL. |
| Réservés : sub-delims | ! $ & ' ( ) * + , ; = | Délimitent les données à l’intérieur d’une partie, comme & et = dans les chaînes de requête. |
Les caractères réservés doivent être encodés lorsqu’ils apparaissent comme données et non comme délimiteurs. Une recherche de R&D doit être envoyée sous la forme q=R%26D ; sinon, le serveur voit un second paramètre appelé D.
encodeURIComponent et encodeURI
JavaScript propose deux fonctions, et choisir la mauvaise est une source fréquente de bugs :
encodeURIComponent()encode tout saufA–Z a–z 0–9 - _ . ! ~ * ' ( ). Utilisez-la pour des valeurs individuelles : paramètres de requête, segments de chemin, données de fragment.encodeURI()laisse en plus intacts; , / ? : @ & = + $ #, elle peut donc être appliquée à une URL complète sans en casser la structure. Elle ne protège pas une valeur qui contient&ou#.
encodeURI("https://example.com/a b?q=R&D")
// "https://example.com/a%20b?q=R&D" (& laissé tel quel)
"https://example.com/search?q=" + encodeURIComponent("R&D")
// "https://example.com/search?q=R%26D"
Mieux encore, laissez URLSearchParams ou la bibliothèque d’URL de votre langage construire les chaînes de requête à votre place.
Pièges courants
+ ou %20
Les formulaires HTML soumis en application/x-www-form-urlencoded encodent une espace sous la forme +. Dans les URL de la RFC 3986, + est un signe plus littéral et une espace s’écrit %20. Un décodeur qui ne sait pas quelle convention a été utilisée peut transformer C++ en C ou laisser des + à la place des espaces. Par précaution, encodez un vrai signe plus en %2B.
Python: urllib.parse.quote("a b&c") → a%20b%26c
urllib.parse.quote_plus("a b&c") → a+b%26c
Double encodage
Encoder une chaîne déjà encodée échappe les signes pourcentage eux-mêmes : %20 devient %2520. Cela arrive généralement lorsqu’une valeur est encodée par votre code puis de nouveau par un framework ou un client HTTP. Si vous voyez %25 dans une URL, soupçonnez un double encodage. Décoder deux fois est tout aussi nuisible : cela peut transformer un %41 littéral dans des données utilisateur en A.
Encoder toute l’URL comme un composant
Exécuter encodeURIComponent sur une URL complète échappe :// et chaque /, ce qui produit https%3A%2F%2F.... C’est correct uniquement lorsque l’URL est elle-même une valeur de paramètre, comme un redirect_uri.
Astuces
- Les chiffres hexadécimaux des encodages en pourcentage ne sont pas sensibles à la casse, mais la RFC 3986 recommande les majuscules (
%2F, et non%2f). - Les noms de domaine internationalisés ne sont pas encodés en pourcentage ; ils utilisent le Punycode (
xn--). - Besoin de transporter des données binaires dans une URL ? Le Base64 compatible URL est plus compact que l’encodage en pourcentage de chaque octet.
- Inspectez la façon dont un serveur traite votre requête encodée avec le vérificateur d’en-têtes HTTP.
Questions fréquentes
Pourquoi une espace est-elle parfois + et parfois %20 ?
+ vient de l’encodage des formulaires HTML utilisé dans les chaînes de requête et les corps de requêtes POST ; %20 est l’encodage général de la RFC 3986, valable partout dans une URL. En cas de doute, utilisez %20.
Quels caractères n’ont jamais besoin d’être encodés ?
L’ensemble des caractères non réservés : lettres, chiffres, trait d’union, point, tiret bas et tilde. Tout le reste doit être encodé lorsqu’il fait partie d’une valeur.
L’encodage d’URL est-il une mesure de sécurité ?
Non. Il rend seulement les données syntaxiquement sûres à l’intérieur d’une URL et il est entièrement réversible. Il ne masque pas les données et n’empêche pas à lui seul une injection.
Comment décoder une URL contenant des séquences %uXXXX ?
%uXXXX est un format non standard produit par la fonction JavaScript obsolète escape(). Les décodeurs standard le rejettent ; il faut le convertir séparément.
Mis à jour