Aller au contenu

Décoder une URL

Retransformez %E2%9C%93 en ✓. Chaînes doublement encodées, encodage de formulaire et saisies à moitié cassées : tout est traité plutôt que refusé. Rien n'est conservé.

  • Jamais conservé
  • Pas de file d'attente, pas d'attente
  • Sans inscription, sans filigrane
Décodé

Le résultat (Décodé) s'affiche ici.

Comment ça marche

1

Collez le texte encodé

Une URL entière, une chaîne de requête ou une seule valeur.

2

Choisissez la variante si besoin

Décodage standard, ou décodage de formulaire où + signifie une espace. En cas de doute, la page vous signale quand les deux diffèrent.

3

Copiez le résultat

Décodez à nouveau si le texte a été encodé deux fois — c'est courant, et facile à repérer une fois qu'on l'a vu.

L'ambiguïté que rien ne peut lever à votre place

Le décodage est mécaniquement simple — repérer chaque % suivi de deux chiffres hexadécimaux, le retransformer en octet, puis lire les octets en UTF-8 — et il ne comporte qu'une seule véritable ambiguïté. Un signe plus peut signifier une espace, ou bien un plus. Dans un formulaire envoyé, il signifie une espace, selon une convention plus ancienne que la spécification des URL elle-même. Dans un segment de chemin, c'est un caractère littéral. Rien dans le texte n'indique quel cas s'applique : la page vous montre donc les deux lectures plutôt que d'en choisir une et de se tromper sans rien dire — ce qui compte surtout là où l'erreur fait le plus mal, une adresse e-mail ou une valeur base64 où le plus fait réellement partie des données.

Le texte non ASCII arrive sous forme de plusieurs séquences pourcent par caractère, car l'encodage porte sur les octets UTF-8 et non sur les caractères : une lettre accentuée en donne deux, la plupart des symboles trois, un emoji quatre. Décodez une séquence qui n'est pas de l'UTF-8 valide et vous obtenez des caractères de remplacement — signe, en général, que le texte a été encodé depuis un autre jeu de caractères, ou qu'il a été coupé au milieu d'un caractère.

Décoder deux fois est une faille de sécurité, pas une simple erreur. Si une valeur est décodée, contrôlée, puis décodée à nouveau, un attaquant peut cacher des caractères au contrôle : %252e%252e%252f passe un filtre qui cherche « ../ », car après un premier passage il reste %2e%2e%2f, et après le second il devient justement la remontée de répertoire que le filtre devait bloquer. Décodez exactement une fois, puis validez, et jamais dans l'autre ordre.

Un texte qui n'a jamais été encodé revient tel quel, sans être abîmé — le comportement utile quand vous ne savez pas si une chaîne a besoin d'être décodée. Un signe pourcent qui n'est pas suivi de deux chiffres hexadécimaux est laissé en place au lieu d'être traité comme une erreur : c'est un pourcent littéral, fréquent dans un texte collé plutôt qu'encodé.

Si vous cherchez autre chose

Dans le code, le décodeur doit correspondre à l'encodeur. JavaScript propose decodeURIComponent ; Python sépare unquote et unquote_plus précisément à cause de la question du signe plus ; PHP a rawurldecode et urldecode pour la même raison. Mieux encore, laissez un type URL ou un analyseur de chaîne de requête s'en charger — la plupart des frameworks décodent les paramètres pour vous, et décoder à nouveau ensuite, c'est exactement ainsi que s'écrit le bug du double décodage décrit plus haut.

Pour examiner une longue URL plutôt que décoder une valeur, un analyseur vaut mieux qu'un décodeur : python -c "import urllib.parse,sys; print(urllib.parse.urlparse(sys.argv[1]))" découpe une adresse en ses différentes parties pour que vous voyiez quel morceau est lequel avant de décoder quoi que ce soit — c'est généralement la vraie question quand un lien se comporte mal.

Questions fréquentes

Il reste des %25 dans mon texte après décodage

Il a donc été encodé deux fois, ce qui est extrêmement courant : cela arrive dès qu'une valeur déjà encodée est encodée à nouveau en passant par une redirection ou une couche de journalisation. %25 est l'encodage du caractère % lui-même : le premier décodage transforme %2520 en %20, et un second en fait une espace. Il suffit de décoder à nouveau. La page vous prévient quand elle repère ce schéma.

Le « + » doit-il devenir une espace ?

Cela dépend de la provenance de la chaîne, c'est pourquoi c'est un choix et non une supposition. Dans un corps application/x-www-form-urlencoded — un formulaire HTML envoyé — le + signifie une espace. Dans un segment de chemin, ou dans des données qui ont simplement transité par une URL, le + est un caractère plus littéral, et le transformer en espace corrompt la valeur. Les chaînes base64 sont le cas piège : elles contiennent de vrais +, et un décodage de formulaire les détruit.

Que se passe-t-il avec une chaîne cassée ?

Elle est décodée autant que possible et le reste est laissé tel quel, au lieu de tout refuser. Un % isolé qui ne fait pas partie d'une séquence valide — fréquent quand un texte a déjà été partiellement décodé, ou tronqué — fait lever une erreur au décodeur du navigateur, qui ne renvoie rien. Ici, chaque séquence valide est décodée et les caractères isolés restent tels quels, ce qui est bien plus utile quand vous essayez de lire une ligne de journal abîmée.

Mon texte est-il conservé quelque part ?

Non. Rien n'est conservé et aucune requête n'est envoyée. Vous pouvez vous déconnecter d'Internet une fois la page chargée, elle continue de fonctionner.

Puis-je décoder une URL entière d'un coup ?

Oui. Collez-la en entier : la structure reste lisible et seules les parties encodées sont retransformées en texte, si bien qu'une longue URL chargée de paramètres encodés devient enfin lisible.

Bon à savoir : Le signe plus est ambigu : dans une chaîne de requête, il signifie une espace ; dans un chemin, c'est un plus littéral. La page décode dans les deux sens et vous montre lequel est lequel au lieu de deviner. Un texte qui n'a jamais été encodé est renvoyé tel quel, sans être abîmé.

Intégrez cet outil à votre site

Gratuit pour tout blog, page de cours ou article d'aide. Collez un seul extrait de code et vos visiteurs pourront l'utiliser directement sur votre page.