Intermédiaire 8 min de lecture 25 janvier 2025

URL decode : décoder correctement les URL et éviter les pièges

Les URL semblent simples, jusqu’au moment où un formulaire transforme un plus en espace, une API renvoie du %2F au lieu de /, ou un double encodage casse votre route. "URL decode" paraît trivial, mais le contexte change tout. Voici ce qu’il faut connaître pour décoder sans surprise.

Décodage d’URL : de quoi parle-t-on ?

Le décodage d’URL consiste à transformer des séquences percent-encodées (%xx) et des conventions d’encodage en caractères lisibles, en tenant compte du contexte (chemin, requête, formulaire).

Les principales variantes et zones d’ombre à comprendre :

1 application/x-www-form-urlencoded (requêtes)

Dans les corps/formulaires et les query strings : le signe + représente un espace.

"a+b" => "a b", "%20" => " " , "&" sépare les paires clé=valeur

2 Percent-encoding RFC 3986

Codage des octets par %HH (hex). Les caractères réservés doivent parfois rester encodés.

"%2F" => "/", "%3F" => "?", "%23" => "#", "%25" => "%"

3 Unicode et encodage des octets

Les caractères non ASCII sont encodés en UTF-8 (recommandé). Confusion fréquente avec Latin-1.

"é" (UTF‑8) => %C3%A9
"é" (Latin‑1) => %E9 # mauvais si l’appli attend de l’UTF‑8
"€" => %E2%82%AC

4 Variantes techniques de décodage

Différences entre fonctions et contextes : attention aux réservés et au double-encodage.

PHP: urldecode() vs rawurldecode()
JS: decodeURIComponent() vs decodeURI()
Double encodage: "%252F" => "%2F" => "/"

Problèmes classiques

Copier-coller d’URL déjà encodées

Introduit du double encodage : %2F devient %252F et casse le routage.

Tests unitaires qui échouent

Fonctions différentes selon l’environnement (urldecode vs rawurldecode, decodeURI vs decodeURIComponent).

Plus (+) traité comme espace par erreur

Le + est un espace uniquement en x-www-form-urlencoded (query/body), pas dans les chemins.

Décodage trop agressif

Décoder %2F dans un chemin peut modifier la sémantique et créer des failles.

Exemple de problème courant :

# Deux URL semblent équivalentes mais ne le sont pas
url1 = "https://site.com/api/files%2F2025/report.pdf"
url2 = "https://site.com/api/files/2025/report.pdf" # %2F vs /
assert decode_path(url1) == url2 # ❌ Échec si le décodage du / n’est pas souhaité

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un endpoint fonctionne en navigateur mais renvoie 400 avec curl
!
Des + deviennent des espaces dans la base après import
!
Des % apparaissent en double (%252F) dans vos logs
!
Un paramètre contenant "é" est illisible après décodage
!
Le routage casse quand un %2F arrive dans un segment de chemin

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII vous aide à visualiser et décoder instantanément les séquences d’URL. Collez une URL ou une query string : l’outil décode, met en évidence les %xx, signale le double encodage et vous montre le résultat final lisible.

✅ Décodage à la volée

Percent-encoding, + en espace (form), caractères non ASCII

📊 Analyse complète

Surbrillance des %xx, détection UTF‑8 vs Latin‑1, segments suspects

🧹 Correction intelligente

Aplatit le double encodage, normalise la casse hexadécimale

💾 Export propre

Copier/coller du texte décodé prêt à l’emploi

Autres méthodes de détection

Affichage dans l'éditeur

Recherchez les motifs %HH avec une regex pour repérer l’encodage
Extensions d’éditeur pour décoder/afficher les segments percent-encodés

En ligne de commande (Unix)

# Repérer les séquences percent-encodées
grep -oP "%[0-9A-Fa-f]{2}" fichier.txt | sort | uniq -c
# Décoder une chaîne (Python)
python3 -c "import sys,urllib.parse;print(urllib.parse.unquote(sys.argv[1]))" "q=a%2Bb+et+%C3%A9"
# Décoder en PHP
php -r 'echo urldecode($argv[1]);' "name=%C3%A9lise+dupont"
# Voir les octets pour vérifier l’UTF-8
printf "%b" "$(echo "q=%C3%A9" | sed "s/%/\\x/g")" | hexdump -C

En code

JavaScript

decodeURIComponent("q=a%2Bb+et+%C3%A9").replace(/\+/g, " ")

Python

urllib.parse.unquote("name=%C3%A9lise+dupont").replace("+", " ")

Excel / Google Sheets

=SUBSTITUE(A1; "+"; " ") /* pour l’espace; décodage %xx via Power Query ou script */

Décoder proprement et prévenir

🚀 Décodage rapide avec Clean ASCII

Avant d’écrire des scripts, utilisez Clean ASCII pour décoder vos URL en un clic :

Décodage percent-encoding
Gestion du + (form)
Détection double encodage

Méthodes techniques avancées

🔧 Normaliser

Utilisez UTF‑8 partout (serveur, client, base, API)
Uniformisez la casse des hex (%2f → %2F) et les fins de ligne
Décoder la query, mais laissez certains réservés encodés dans les chemins

🧹 Filtrer

Validez les séquences %HH (hex) et rejetez les formes invalides (%GZ)
Limitez ce que vous décodez (pas de %2F dans des segments sensibles)
Traitez "+" comme espace seulement pour x-www-form-urlencoded

⚙️ Automatiser

Hooks pre-commit pour refuser les URL double-encodées ou invalides
Tests end-to-end avec cas "+", espaces, %2F, %00, UTF‑8
Linting CI pour vérifier la cohérence encode/decode des endpoints

Checklist rapide

Encodage et décodage en UTF‑8 de bout en bout
Utiliser urldecode/rawurldecode selon le contexte (query vs chemin)
Interdire le double encodage/décodage dans la stack
Vérifier les %HH avec une validation stricte
Tests dédiés pour "+", espaces, slash encodé et caractères non ASCII
Documentation claire équipe: quand décoder, quoi laisser encodé

Conclusion

Le "url decode" est simple en apparence, mais le contexte (query, chemin, formulaire) change la règle du jeu. En maîtrisant les différences, vous évitez des heures de débogage.

Adoptez un décodage cohérent, validez vos entrées et standardisez UTF‑8 pour éliminer la majorité des erreurs d’URL.

Décoder vos URL maintenant

Utilisez notre outil pour décoder et analyser les URL percent-encodées en toute sécurité.

Analyser mes URL