Comment encoder une chaîne pour une URL
- Saisissez ou collez le texte dans Texte ou URL. La sortie se met à jour pendant la saisie.
- Choisissez le mode sous Encoder :
- Composant (encodeURIComponent) pour une valeur de requête, un champ de formulaire ou un segment de chemin.
- URL complète (encodeURI) pour une URL entière qui contient des espaces ou des caractères non ASCII.
- Données de formulaire (espace en +) pour les corps
application/x-www-form-urlencodedet les query strings construites à la manière des formulaires HTML. - Tous les caractères pour encoder en pourcent tous les octets, lettres comprises, afin de tester des décodeurs.
- Laissez Jeu de caractères sur UTF-8, sauf si le système destinataire attend un ancien encodage.
- Cochez Chaque ligne séparément pour encoder une liste de valeurs d’un coup, puis Copier la sortie. Inverser envoie le résultat au décodeur pour vérifier l’aller-retour.
Une URL complète saisie est aussi découpée en schéma, hôte, chemin, chacun des paramètres de requête et fragment, dans un tableau sous les panneaux.
encodeURIComponent, encodeURI ou encodage de formulaire
La même entrée, a b&c=d/é?#+, dans les trois styles courants :
| Mode | Sortie | Usage |
|---|---|---|
Composant (encodeURIComponent) | a%20b%26c%3Dd%2F%C3%A9%3F%23%2B | une seule valeur dans une URL |
URL complète (encodeURI) | a%20b&c=d/%C3%A9?#+ | une URL entière déjà correctement structurée |
Données de formulaire (URLSearchParams) | a+b%26c%3Dd%2F%C3%A9%3F%23%2B | envois de formulaires HTML, beaucoup de bibliothèques de query strings |
Composant ne laisse non échappés que A–Z a–z 0–9 - _ . ! ~ * ' ( ). URL complète garde en plus ; / ? : @ & = + $ , #, les caractères qui donnent sa structure à une URL : il ne peut donc pas protéger une valeur qui les contient. Données de formulaire ne garde que les lettres, les chiffres et - _ . *, et écrit les espaces sous forme de +.
Le bug classique consiste à construire une URL avec l’encodage URL complète : ?q=C++ & Go garde le + et le &, et le serveur reçoit q=C plus un paramètre parasite. Encodez plutôt la valeur avec Composant : ?q=C%2B%2B%20%26%20Go.
Espaces, signes plus et autres fauteurs de troubles
| Caractère | Encodé | Pourquoi c’est important |
|---|---|---|
| espace | %20 ou + | + ne signifie espace que dans les query strings et les corps de formulaire |
+ | %2B | non encodé, beaucoup de serveurs le transforment en espace : +49 30 1234567 devient 49 30 1234567 |
& | %26 | commence un nouveau paramètre de requête |
= | %3D | sépare le nom et la valeur ; le Base64 standard se termine par ce caractère |
/ | %2F | sépare les segments de chemin ; certains serveurs refusent %2F dans les chemins |
# | %23 | commence le fragment, qui n’est jamais envoyé au serveur |
% | %25 | doit lui-même être encodé, sinon le décodeur lit un échappement cassé |
€ | %E2%82%AC | trois octets UTF-8, trois échappements |
Le Base64 dans une URL est un cas typique du problème +, / et =. Encodez-le en pourcent comme un composant, ou passez au Base64URL, qui évite ces caractères.
Jeux de caractères autres que l’UTF-8
L’encodage pourcent travaille sur des octets : c’est donc le jeu de caractères qui détermine le résultat. é donne %C3%A9 en UTF-8 et %E9 en Windows-1252 ou ISO-8859-1. Les navigateurs et les API modernes utilisent l’UTF-8, mais d’anciennes applications PHP, certaines passerelles de paiement et des systèmes intranet hérités attendent encore du Latin-1 ou du Windows-1252, et les sites japonais parfois du Shift_JIS. Choisissez le jeu de caractères correspondant sous Jeu de caractères. Un caractère qui n’existe pas dans le jeu choisi ne peut pas être représenté : vérifiez la sortie pour ces cas-là.
L’encodage d’URL dans le code
encodeURIComponent("a b&c") // "a%20b%26c"
new URLSearchParams({ q: "C++ & Go" }).toString() // "q=C%2B%2B+%26+Go"
from urllib.parse import quote, quote_plus, urlencode
quote("/files/a b.txt") # '/files/a%20b.txt' (keeps / by default)
quote("/files/a b.txt", safe="") # '%2Ffiles%2Fa%20b.txt'
quote_plus("a b&c") # 'a+b%26c'
urlencode({"q": "C++ & Go"}) # 'q=C%2B%2B+%26+Go'
Le quote de Python garde / sauf si vous passez safe="", une surprise fréquente quand on encode une valeur. Ailleurs : en PHP, rawurlencode donne %20 et urlencode donne + ; en Java, URLEncoder.encode fait de l’encodage de formulaire avec + ; Go a url.PathEscape (%20) et url.QueryEscape (+). encodeURIComponent laisse ! ' ( ) * tels quels ; pour une sortie strictement RFC 3986, remplacez-les ensuite :
const strict = s => encodeURIComponent(s).replace(/[!'()*]/g,
c => "%" + c.charCodeAt(0).toString(16).toUpperCase());
Le côté JavaScript est détaillé sur la page Base64 en JavaScript. Pour faire l’inverse, utilisez le décodeur d’URL.
FAQ
Qu'est-ce que l'encodage d'URL ?
L’encodage d’URL, ou encodage pourcent, remplace les caractères interdits ou ayant un sens particulier dans une URL par % suivi des deux chiffres hex de chaque octet. Une espace devient %20, & devient %26, et é en UTF-8 devient %C3%A9.
Comment encoder une espace dans une URL : %20 ou + ?
%20 fonctionne partout. + ne signifie une espace que dans les query strings et les corps de formulaire qui suivent la convention d’encodage des formulaires ; dans un chemin, c’est un plus littéral. En cas de doute, utilisez %20.
Faut-il encoder l'URL entière ?
Non, encodez chaque valeur avant de l’insérer. Encoder une URL entière avec Composant échappe aussi :, /, ? et &, ce qui la casse. Le mode URL complète garde ces caractères structurels et ne corrige que les espaces et le texte non ASCII.
Pourquoi ma chaîne encodée contient-elle %25 ?
%25 est un signe pourcent encodé : l’entrée était déjà encodée et a été encodée une seconde fois, a%20b devient alors a%2520b. Encodez le texte brut une seule fois.
Hex en majuscules ou en minuscules dans l'encodage pourcent ?
La RFC 3986 considère %2F et %2f comme équivalents et recommande les majuscules. Ne cochez Hex en minuscules que pour correspondre à un système qui produit des minuscules, par exemple pour comparer des signatures.