FmtDev
Langue
Retour au blog
25 mars 2026

L'encodage URL expliqué : Pourquoi %20 signifie espace

Comprenez comment fonctionne l'encodage URL, pourquoi les caractères spéciaux doivent être encodés, et ce que signifient %20, %3A, %2F et autres valeurs encodées. Guide pratique pour développeurs.

Qu'est-ce que l'encodage URL ?

Chaque fois que vous voyez %20 dans une URL, vous voyez l'encodage URL en action.

L'encodage URL (également appelé encodage en pourcentage) est le processus de conversion des caractères qui ne sont pas autorisés dans les URL dans un format qui peut être transmis en toute sécurité. Il remplace les caractères dangereux par un signe % suivi de deux chiffres hexadécimaux représentant le code ASCII du caractère.

Par exemple :

  • Un espace devient %20
  • Un signe @ devient %40
  • Un dièse # devient %23
  • Un slash / devient %2F

C'est pourquoi une recherche Google pour « hello world » produit une URL comme :

https://www.google.com/search?q=hello%20world

L'espace entre « hello » et « world » ne peut pas exister dans une URL, il est donc encodé en %20.

Pourquoi les URL ont besoin d'encodage

Les URL ont des règles strictes sur les caractères autorisés. Ces règles proviennent de la RFC 3986, la spécification officielle de la syntaxe URI.

Caractères sûrs (aucun encodage nécessaire)

Ces caractères peuvent apparaître dans les URL sans encodage :

A-Z  a-z  0-9
-  _  .  ~

Les lettres, les chiffres, les traits d'union, les underscores, les points et les tildes sont toujours sûrs.

Caractères réservés (doivent être encodés lorsqu'ils sont utilisés comme données)

Ces caractères ont une signification spéciale dans les URL :

| Caractère | Signification | Encodé | |---|---|---| | / | Séparateur de chemin | %2F | | ? | Début de la query string | %3F | | & | Séparateur de paramètres | %26 | | = | Séparateur clé-valeur | %3D | | # | Identifiant de fragment | %23 | | @ | Séparateur d'infos utilisateur | %40 | | : | Séparateur de port | %3A | | + | Espace (dans les formulaires) | %2B |

Lorsque ces caractères apparaissent comme des données (et non comme des éléments structurels), ils doivent être encodés.

Par exemple, si une requête de recherche contient &, elle doit être encodée :

# Mauvais — le & casse la query string
?search=Tom & Jerry&page=1

# Correct — le & dans le terme de recherche est encodé
?search=Tom%20%26%20Jerry&page=1

Caractères dangereux (toujours encoder)

Ces caractères ne sont jamais sûrs dans les URL :

espace  "  <  >  {  }  |  \  ^  `

Ils doivent toujours être encodés en pourcentage.

Encodages courants que vous verrez

| Caractère | Encodé | Vu dans | |---|---|---| | Espace | %20 ou + | Requêtes de recherche, noms de fichiers | | @ | %40 | Adresses e-mail dans les URL | | # | %23 | Hashtags, références d'ancres | | & | %26 | Termes de recherche contenant « and » | | = | %3D | Valeurs contenant des signes égal | | / | %2F | Chemins de fichiers dans les paramètres de requête | | ? | %3F | Questions dans les requêtes de recherche | | % | %25 | Le signe pourcentage lui-même | | + | %2B | Signes plus dans les numéros de téléphone | | é | %C3%A9 | Caractères accentués français | | | %E6%97%A5 | Caractères CJK (UTF-8) |

Espace : %20 vs +

Il existe deux façons d'encoder un espace dans une URL :

  • %20 — utilisé dans les chemins d'URL et l'encodage moderne
  • + — utilisé dans les soumissions de formulaires HTML (application/x-www-form-urlencoded)

Les deux représentent un espace, mais ils sont utilisés dans des contextes différents :

Chemin d'URL :   /mon%20fichier.pdf    ← %20
Query string :   ?nom=John+Doe         ← + (encodage formulaire)
Query string :   ?nom=John%20Doe       ← %20 (également valide)

Lors du décodage, votre parseur doit gérer les deux formats.

L'encodage URL en JavaScript

Encodage

JavaScript propose deux fonctions :

// encodeURIComponent — encode tout sauf A-Z a-z 0-9 - _ . ~
encodeURIComponent("hello world & goodbye")
// → "hello%20world%20%26%20goodbye"

// encodeURI — encode mais préserve les caractères structurels de l'URL
encodeURI("https://example.com/path?q=hello world")
// → "https://example.com/path?q=hello%20world"

Règle : Utilisez encodeURIComponent() pour les valeurs de paramètres de requête. Utilisez encodeURI() pour les URL complètes.

Décodage

decodeURIComponent("hello%20world%20%26%20goodbye")
// → "hello world & goodbye"

decodeURI("https://example.com/path?q=hello%20world")
// → "https://example.com/path?q=hello world"

L'encodage URL en Python

from urllib.parse import quote, unquote

# Encodage
quote("hello world & goodbye")
# → "hello%20world%20%26%20goodbye"

# Décodage
unquote("hello%20world%20%26%20goodbye")
# → "hello world & goodbye"

Erreurs courantes

1. Double encodage

Si vous encodez une chaîne qui est déjà encodée, vous obtenez un double encodage :

Original :          hello world
Premier encodage :  hello%20world
Double encodage :   hello%2520world  ← %25 est l'encodage de %

%2520 signifie que le % de %20 a été ré-encodé. C'est un bug très courant qui casse les URL silencieusement.

2. Encoder toute l'URL

// Mauvais — encode aussi les :// et /
encodeURIComponent("https://example.com/path")
// → "https%3A%2F%2Fexample.com%2Fpath"

// Bon — n'encodez que les valeurs de paramètres
const base = "https://example.com/search";
const query = encodeURIComponent("hello world");
const url = `${base}?q=${query}`;
// → "https://example.com/search?q=hello%20world"

3. Oublier de décoder

Lorsque vous lisez des paramètres d'URL, décodez-les toujours :

// URL: ?nom=John%20Doe
const params = new URLSearchParams(window.location.search);
const nom = params.get('nom');
// → "John Doe" (automatiquement décodé)

URLSearchParams gère automatiquement le décodage. Si vous analysez les chaînes de requête manuellement, vous devez appeler decodeURIComponent() vous-même.

4. Ne pas encoder les entrées utilisateur

Si vous construisez des URL à partir d'entrées utilisateur sans encodage, les caractères spéciaux peuvent casser l'URL ou créer des vulnérabilités de sécurité :

// Dangereux — l'entrée utilisateur pourrait contenir & ou = ou d'autres caractères spéciaux
const url = `/search?q=${userInput}`;

// Sûr
const url = `/search?q=${encodeURIComponent(userInput)}`;

C'est particulièrement important pour prévenir les attaques par injection.

UTF-8 et caractères internationaux

Les URL modernes supportent les caractères internationaux via l'encodage UTF-8 :

é → %C3%A9 (2 octets en UTF-8)
ñ → %C3%B1 (2 octets en UTF-8)
日 → %E6%97%A5 (3 octets en UTF-8)
😀 → %F0%9F%98%80 (4 octets en UTF-8)

Chaque octet de la représentation UTF-8 est individuellement encodé en pourcentage. C'est pourquoi les caractères non-ASCII produisent de longues chaînes encodées.

Les navigateurs modernes affichent les caractères internationaux dans la barre d'adresse mais les envoient encodés sur le réseau.

Décoder les URL en toute sécurité

Lorsque vous travaillez avec des URL contenant des données sensibles (endpoints d'API, chemins internes, paramètres d'authentification), faites attention à l'endroit où vous les décodez.

Les décodeurs d'URL en ligne traitent vos données sur leurs serveurs. Si votre URL contient des chemins d'API internes, des jetons d'authentification ou des paramètres de requête sensibles, vous exposez ces informations à un tiers.

Utilisez un décodeur qui s'exécute entièrement dans votre navigateur. Aucune donnée ne doit quitter votre machine.

Le Décodeur URL de FmtDev traite tout localement. Vos URL ne quittent jamais votre navigateur.

Points clés à retenir

  1. L'encodage URL remplace les caractères dangereux par % suivi de valeurs hexadécimales
  2. Les espaces deviennent %20 dans les URL et + dans les formulaires
  3. Utilisez encodeURIComponent() pour les valeurs de paramètres, encodeURI() pour les URL complètes
  4. Attention au double encodage — il casse les URL silencieusement
  5. Encodez toujours les entrées utilisateur avant de les mettre dans une URL
  6. Les caractères internationaux sont encodés en séquences UTF-8 multi-octets
  7. Pour les URL sensibles, décodez localement — n'utilisez jamais d'outils en ligne

Articles Connexes

Outil associé

Prêt à utiliser l'outil Encodeur et Décodeur Base64 Gratuit en Ligne ? Toute l'exécution est locale.

Ouvrir Encodeur et Décodeur Base64 Gratuit en Ligne