Intermédiaire 8 min de lecture 25 janvier 2025

URL encode: tout ce qu'il faut savoir pour encoder vos URLs sans bugs

Un lien qui marche dans le navigateur mais pas en cURL, une API qui renvoie 400, une redirection qui boucle. Très souvent, la cause est un encodage d'URL incorrect. L'encodage est invisible, mais critique. Voici comment fonctionne l'URL encoding, où ça casse, et comment le maîtriser.

Qu'est-ce que l'URL encoding ?

C'est le percent-encoding défini par la RFC 3986: certains caractères sont transformés en %XX (hex) pour être transmis sans ambiguïté.

Les grandes familles à connaître :

1 Caractères réservés et non réservés (RFC 3986)

Réservés: ont une signification spéciale. Non réservés: alphanumériques et -._~.

Réservés: : / ? # [ ] @ ! $ & ' ( ) * + , ; =
Non réservés: A-Z a-z 0-9 - . _ ~

2 Espace, + et application/x-www-form-urlencoded

Dans les corps de formulaire et les query strings de formulaires, l'espace devient +, pas %20.

"Hello World" → Hello+World (form) | Hello%20World (RFC 3986)

3 Unicode et UTF-8 dans les URLs

Les caractères non ASCII doivent être convertis en bytes UTF-8 puis percent-encodés.

é → UTF-8: C3 A9 → %C3%A9
😊 → F0 9F 98 8A → %F0%9F%98%8A
Évitez %E9 (Latin-1) si votre pile attend UTF-8

4 Différences selon le composant d'URL

Chemin, query, fragment: les règles d'encodage diffèrent légèrement.

Chemin: ne pas encoder "/" dans un segment complet, mais encoder chaque segment
Query: encoder chaque clé/valeur; "+" peut signifier espace (selon le contexte)
Fragment: souvent laissé tel quel par les navigateurs, mais encodable

Problèmes classiques

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

Double-encodage: %20 devient %2520, %2F devient %252F, provoquant des 404.

Tests unitaires qui échouent

Comparaison d'URL entre rawurlencode et urlencode, ou encodage attendu en UTF-8 vs Latin-1.

+ vs %20 selon le contexte

Confusion entre encodage de formulaire (+) et encodage d'URL RFC 3986 (%20) pour les espaces.

Concaténation manuelle de query string

Oublis d'encodage sur une clé/valeur, ou encodage de "?" et "&" qui cassent la chaîne.

Exemple de problème courant :

# Deux chaînes percent-encodées qui n'expriment pas la même chose
string1 = "%2Fimages%2Flogo.png"
string2 = "%252Fimages%252Flogo.png" # double-encodé
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
404 uniquement quand l'URL contient espace, +, é, ou / dans un paramètre
!
Une API renvoie 400/422 pour certains inputs mais pas d'autres
!
Les redirections percent-encodent à chaque saut et créent une boucle
!
Dans les logs, vous voyez %2520, %2B ou %2F inattendus
!
Un lien fonctionne au clic mais échoue via cURL ou fetch()

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII permet d’encoder et décoder des URLs, d’identifier les séquences % invalides et de comparer version brute et encodée. Vous visualisez les composants (chemin, query) et les octets UTF-8 derrière chaque caractère.

✅ Détection automatique

Séquences % incomplètes, double-encodage, caractères interdits

📊 Analyse complète

Différence urlencode vs rawurlencode, path vs query, bytes UTF-8

🧹 Nettoyage automatique

Re-encodage correct selon RFC 3986, choix du mode query/form

💾 Export propre

URL normalisée prête pour vos requêtes et intégrations

Autres méthodes de détection

Affichage dans l'éditeur

Inspectez les requêtes dans l’onglet Réseau des DevTools (URL encodée/décodée)
Utilisez la console: encodeURIComponent()/decodeURIComponent pour tester

En ligne de commande (Unix)

# Décoder une chaîne percent-encodée (bash)
url='%25F0%259F%2598%258A'; printf '%b\n' "${url//%/\\x}"
# Encoder avec jq
printf '%s' 'café & thé' | jq -Rr @uri
# Python: décoder
python3 -c "import sys,urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "%C3%A9"
# cURL: désactiver le globbing et tester
curl --globoff "https://exemple.com/search?q=caf%C3%A9"

En code

JavaScript

encodeURIComponent("café & thé") // "caf%C3%A9%20%26%20th%C3%A9"

Python

from urllib.parse import quote, quote_plus
quote("a b/c") # "a%20b/c"
quote_plus("a b") # "a+b"

Excel / Google Sheets

ENCODEURL("café & thé")

Nettoyer et prévenir

🚀 Encoder correctement avec Clean ASCII

Avant d’écrire des helpers, utilisez Clean ASCII pour décoder, corriger et ré-encoder vos URLs instantanément.

Détection automatique
Encodage conforme RFC 3986
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Travaillez en UTF-8 de bout en bout avant l’encodage
Ne jamais encoder deux fois; stockez décodé, encodez aux frontières
Différenciez segments de chemin (rawurlencode) et query (constructeurs)

🧹 Filtrer

Utilisez des fonctions dédiées: http_build_query (PHP), URLSearchParams
Remplacez l’assemblage manuel par des builders d’URL fiables
Bloquez les séquences % invalides et traquez les doublons (%25...)

⚙️ Automatiser

Tests round-trip: decode(encode(x)) == x et pas de double-encodage
Linting des href/URLs dans le code pour espaces non encodés
Contrôles CI: refus des % suivis de non-hex ou de %25%25...

Checklist rapide

Chaînes en UTF-8 avant encodage
rawurlencode pour les segments de chemin (PHP)
http_build_query ou URLSearchParams pour la query
Pas de double-encodage (encode une seule fois aux frontières)
Tests pour %20 vs + selon le contexte (form vs RFC 3986)
Documentation interne: RFC 3986, path vs query, encodage UTF-8

Conclusion

L'URL encoding est discret mais déterminant. Bien appliqué, il fait disparaître une grande partie des bugs réseau et 404 inexpliquées.

Standardisez vos méthodes d'encodage, travaillez en UTF-8 et encodez au bon moment: vous sécurisez la fiabilité de vos intégrations.

Encodez correctement vos URLs maintenant

Utilisez notre outil pour décoder, corriger et encoder vos URLs conformément aux bonnes pratiques.

Encoder mes URLs