URL Encoder / Decoder · Encoding
Encodeur / Décodeur d’URL & analyseur de chaîne de requête
Encodez une valeur comme sa position l’exige vraiment, décodez-en une qui est revenue abîmée, ou collez une URL entière et lisez chaque paramètre de requête avec son texte brut à côté. Le double encodage, + contre %20, les hôtes en punycode et les clés répétées sont tous nommés — côté client, sans rien envoyer.
S’exécute dans votre navigateur — rien de ce que vous collez ne quitte cette page. Comment nous le prouvons
Bac à sable de l’encodeur, du décodeur et de l’analyseur de chaîne de requête d’URL
Paste a full URL, a bare query string starting with ?, or a form body like a=1&b=2. Nothing is uploaded — the whole thing runs in this tab, so query strings carrying tokens stay yours.
Results update as you type — press Enter to run now.
Paste a URL to see its components and every query parameter decoded — or switch to Decode or Encode to work on one value at a time.
L’écart
Un bouton, et une supposition cachée sur la destination de la valeur.
Presque toutes les boîtes « URL encode » du web sont un unique bouton branché sur encodeURIComponent(), et elles ne le disent jamais. C’est la bonne règle pour une valeur de requête et la mauvaise pour une URL déjà assemblée : donnez-lui un lien et chaque : et / revient en %3A et %2F. Encodez deux fois par accident et vous obtenez %2520, le bug qui casse les allers-retours du redirect_uri OAuth et met un callback de webhook en 404 à 3 h du matin.
Cet outil rend le choix explicite au lieu de le cacher. Règles de composant ou d’URL entière, + ou %20 — et, en mode Parse, les composants qu’un navigateur enverra réellement à côté du texte brut que vous avez collé, chaque paramètre décodé et étiqueté : doublon, clé sans valeur, valeur vide, doublement encodé.
C’est aussi la raison de ne pas demander à un chatbot. Un modèle de langue auquel on demande « encode ceci pour une URL » prédit des caractères : il mélange + et %20 dans une même chaîne, oublie que é fait deux octets, et « répare » avec assurance une valeur doublement encodée en l’encodant une troisième fois. Cette page exécute l’algorithme réel, octet par octet, et fixe chaque règle appliquée par un vecteur de test — pour que vous puissiez vérifier la réponse reçue contre la spécification plutôt que contre un paragraphe assuré.
Vous travaillez sur un jeton plutôt que sur une URL ? Le JWT Decoder découpe et décode en base64url un JWT, et l’ encodeur / décodeur Base64 gère l’alphabet base64url.
Le pipeline
Comment ça marche.
Quatre étapes déterministes, toutes dans votre onglet : le texte brut est diagnostiqué avant que le parseur d’URL n’ait le droit de normaliser quoi que ce soit.
-
Découper le texte brut d’abord.
L’entrée est coupée sur ses propres ? et # avant qu’un parseur ne la touche, pour qu’un diagnostic puisse pointer le caractère exact : le standard des URL supprime silencieusement tabulations et retours à la ligne.
-
Décoder chaque partie séparément.
Noms et valeurs sont décodés séparément : un %26 dans une valeur ne peut jamais devenir un séparateur, ni un %3D couper un nom.
-
Lire les octets en UTF-8.
Les échappements deviennent des octets, les octets deviennent du texte. Une séquence mal formée est nommée octet par octet au lieu de lever l’URIError que donnerait decodeURIComponent().
-
Normaliser comme un navigateur, montrer les deux.
Le parseur WHATWG fournit ce que tout client HTTP enverra réellement — hôte en punycode, port par défaut supprimé — avec votre texte brut à côté.
Référence
Caractères réservés, par composant.
RFC 3986 n’a pas une liste unique de caractères « dangereux ». Un caractère est réservé parce qu’il signifie quelque chose à une position donnée : savoir s’il doit être échappé dépend donc entièrement de l’endroit où il se trouve.
| Caractère | Dans un segment de chemin | Dans un nom / une valeur de requête |
|---|---|---|
| / gen-delim | À encoder (%2F), sinon il coupe le segment | Sûr comme donnée, mais certains proxys le normalisent |
| ? gen-delim | À encoder (%3F) : il ouvre la requête | Sûr après le premier ? |
| # gen-delim | À encoder (%23) | À encoder (%23) : il ouvre le fragment |
| [ ] gen-delim | À encoder (%5B %5D) | À encoder, même dans un nom du style tags[] |
| : @ gen-delim | Sûr après le premier segment | Sûr |
| & sub-delim | Sûr comme donnée | À encoder (%26) : il sépare les paramètres |
| = sub-delim | Sûr comme donnée | À encoder (%3D) dans un nom ; sûr dans une valeur |
| + sub-delim | Sûr comme donnée | À encoder (%2B) : tel quel, il se lit comme une espace |
| ; sub-delim | Sûr comme donnée | Sûr aujourd’hui, mais un backend historique peut découper dessus |
| ! $ ' ( ) * , sub-delim | Sûr comme donnée | Sûr comme donnée — mais encodeURIComponent() diverge sur ! ' ( ) * |
| % marqueur d’échappement | Toujours %25 | Toujours %25 : c’est d’un % nu que naît le double encodage |
| space non autorisé | %20 | %20, ou + dans un corps de formulaire |
Ce que chaque mode laisse tranquille
L’ensemble sûr est toute la différence entre les modes — et entre RFC 3986 et la fonction native du navigateur.
mode left alone (everything else → %XX)
RFC 3986 component A-Z a-z 0-9 - . _ ~
RFC 3986 whole URL …plus : / ? # [ ] @ ! $ & ' ( ) * + , ; =
form-urlencoded A-Z a-z 0-9 * - . _ (space → +)
encodeURIComponent() A-Z a-z 0-9 - . _ ~ ! ' ( ) *
^^^^^^^^^^
RFC 2396 leftovers — encoded here Encodé une fois contre deux fois
Une valeur doublement encodée n’est pas corrompue : elle est correcte, une couche trop profond.
once https%3A%2F%2Fapp.example.com%2Fcb → https://app.example.com/cb
twice https%253A%252F%252Fapp.example.com → https%3A%2F%2Fapp.example.com
^^^ still escaped: decode again
space %20 → " "
%2520 → "%20" → " " (the % became %25) Étape suivante
Le paramètre que vous venez de décoder est un jeton. Lisez-le.
Les chaînes de requête transportent des jetons d’accès, des URL signées et des identifiants de session. Une fois une valeur décodée, le JWT Decoder découpe et vérifie un jeton base64url, et l’ encodeur / décodeur Base64 prend en charge tout ce qui est seulement encodé et non signé — les deux, comme cette page, entièrement dans votre navigateur.
?state=abc%3D%3D → state = abc==
&channel=%23alerts → channel = #alerts
&next=%252Fsettings → next = %2Fsettings ← decode again
&utm_source=a&utm_source=b → two rows, no winner FAQ
Vos questions, nos réponses.
Appuyez sur une question pour afficher la réponse.
Quelle est la différence entre encodeURI et encodeURIComponent ?
encodeURIComponent() échappe presque tout : c’est donc ce que vous appliquez à un seul morceau d’URL — une valeur de requête, un segment de chemin. encodeURI() laisse tranquilles les caractères réservés : / ? # & = + et même #, c’est donc ce que vous appliquez à une URL déjà assemblée qu’il faut seulement débarrasser de ses espaces et de ses caractères non ASCII. Donnez une URL entière à encodeURIComponent et elle devient un bloc opaque (https%3A%2F%2F…) ; donnez une seule valeur à encodeURI et un & qu’elle contient devient silencieusement un séparateur de paramètres. Le mode Encode d’ici expose les deux : la règle de composant est celle par défaut, et la case « Whole URL » est encodeURI() octet pour octet.
Pourquoi une espace devient-elle parfois + et parfois %20 ?
Les deux sont corrects, à des endroits différents. RFC 3986 ne connaît que %20. La convention du + vient de la soumission des formulaires HTML (application/x-www-form-urlencoded) et s’applique aux corps de formulaire et, par vieille habitude, aux chaînes de requête — c’est pourquoi URLSearchParams décode + en espace mais le laisse intact dans un chemin. Autrement dit : %20 est toujours sûr, alors que + n’est une espace que si celui qui a produit la valeur l’a voulu ainsi. Le mode Decode vous montre quelle convention a été appliquée et vous laisse l’inverser, pour distinguer « Ada+Lovelace » le nom de « Ada Lovelace » les deux mots.
Qu’est-ce que l’encodage pourcent, exactement ?
L’encodage pourcent remplace un octet par un % suivi de cet octet écrit en deux chiffres hexadécimaux. Une URL ne peut transporter qu’un petit ensemble de caractères ASCII : tout le reste — une espace, un accent, un emoji, ou un caractère réservé utilisé comme donnée — est d’abord converti en octets UTF-8, puis chaque octet est écrit %XX. é fait deux octets, il devient donc %C3%A9. Décoder fait l’inverse : rassembler les octets, puis les relire en UTF-8.
Comment réparer une URL doublement encodée (%2520) ?
Décodez-la deux fois. %2520 signifie que le % de %20 a lui-même été encodé en %25, ce qui arrive quand un client appelle encodeURIComponent() sur une valeur déjà encodée : le bug classique du redirect_uri OAuth. Cet outil le détecte : collez la valeur en mode Decode et il signale que la première passe contient encore des échappements, montre ce que produit une seconde passe et propose un bouton « Decode again ». Le vrai correctif est en amont : encoder exactement une fois, au moment où la valeur est placée dans l’URL.
Pourquoi mon texte décodé affiche-t-il � au lieu d’un accent ?
Parce que les octets échappés ne sont pas de l’UTF-8 valide. %C3%A9 est une séquence de deux octets bien formée et décode en é, mais %E9 seul est l’octet Latin-1 (ISO-8859-1) de é et n’est pas de l’UTF-8 légal : il décode donc en U+FFFD, le caractère de remplacement. Cet outil nomme les octets fautifs au lieu de lever l’URIError que lèverait decodeURIComponent(), ce qui vous dit que la valeur a été encodée depuis le mauvais encodage source plutôt que de vous laisser deviner.
Que se passe-t-il quand une chaîne de requête répète la même clé ?
Rien dans le standard des URL ne dit laquelle gagne : chaque ligne est donc listée ici et les suivantes sont marquées comme doublons. En pratique PHP et Express gardent la dernière valeur, r.URL.Query() de Go renvoie toutes les valeurs, ASP.NET les joint par des virgules, et Rails ne les regroupe que si la clé finit par []. Ce désaccord est précisément la raison pour laquelle un outil doit vous montrer toutes les valeurs au lieu d’en choisir une en silence.
Qu’est-ce que le punycode, et pourquoi mon hôte a-t-il changé ?
Le punycode est l’encodage ASCII d’un nom de domaine internationalisé. Le DNS ne transporte que des étiquettes ASCII : münchen.example est donc converti en xn--mnchen-3ya.example avant toute résolution — et cette forme ASCII est aussi celle qu’un certificat TLS doit correspondre. Le parseur affiche ici l’hôte converti avec, juste en dessous, le nom que vous avez saisi, afin que vous repériez un domaine sosie. Il ne reconvertit délibérément pas le punycode en Unicode : afficher en joli Unicode un nom fourni par un attaquant, c’est exactement le mécanisme du hameçonnage homographe.
Quels caractères n’ont jamais besoin d’être encodés dans une URL ?
L’ensemble non réservé de RFC 3986 §2.3 : A–Z, a–z, 0–9 et les quatre marques - . _ ~. Ils sont sûrs partout et ne doivent jamais être encodés gratuitement, car %2D et - sont la même URL et les réencoder casse les schémas de signature qui hachent la chaîne brute. À noter : encodeURIComponent() laisse aussi tranquilles ! ' ( ) *, un héritage de l’ancien ensemble « mark » de RFC 2396. RFC 3986 range ces cinq caractères parmi les sous-délimiteurs : le mode composant d’ici les échappe donc, et vous prévient quand il s’écarte de la fonction native du navigateur.
Un point-virgule peut-il séparer des paramètres de requête ?
Plus aujourd’hui. HTML a un temps suggéré que les serveurs acceptent ; à côté de & comme séparateur de paramètres, et ce conseil a été retiré de la spécification en 2014. Les navigateurs et URLSearchParams ne l’ont jamais traité comme un séparateur : a=1;b=2 est donc un unique paramètre nommé a dont la valeur est le littéral 1;b=2. Cet outil reproduit ce comportement et vous prévient quand il voit un point-virgule, car un backend historique peut encore découper dessus et contredire le navigateur qui se trouve devant lui.
Est-il sûr de coller une URL contenant un jeton ?
Oui : l’outil entier est une page statique sans serveur derrière. L’analyse, l’encodage et le décodage s’exécutent dans votre onglet, rien n’est envoyé, il n’y a aucun journal et aucun compte. Cela compte ici plus que pour la plupart des outils, car les chaînes de requête sont précisément là où finissent les jetons d’accès, les URL signées, les identifiants de session et les adresses e-mail. Si vous voulez un second avis, ouvrez le panneau réseau des outils de développement pendant que vous tapez : il n’y a aucune requête à voir.
More free, private DevOps tools.
L’URL Encoder / Decoder est l’un des outils de OpsCanopy — une canopée grandissante de validateurs, convertisseurs et testeurs qui tournent dans le navigateur et ne touchent jamais un serveur.
Plus dans Encodage
39 outils gratuits, tous utilisables hors ligne — opscanopy.com fonctionne sans inscription et sans rien téléverser.
Outils d’encodage voisins : l’ encodeur / décodeur Base64, le JWT Decoder et Slugify pour transformer un titre en chemin propre, ou parcourez le répertoire complet des outils.
Fourni tel quel, par commodité ; l’encodage pourcent est un encodage, pas une protection — un jeton dans une chaîne de requête reste un jeton dans un fichier de log. OpsCanopy est libre et gratuit.