Encoder ou décoder n’importe quel texte d’URL

Encodez en pourcentage une valeur de requête, un segment de chemin ou une URL entière, ou retransformez des séquences %XX en texte lisible. Gère l’UTF-8, les espaces en + des formulaires et une valeur par ligne. Rien ne quitte votre navigateur.

Comment encoder ou décoder une URL

  1. Collez le texte, la valeur ou l’URL dans la zone de saisie.
  2. Choisissez le type d’encodage. Pour une seule valeur de requête ou un segment de chemin, gardez Composant. Pour une adresse entière dont il suffit de corriger les espaces et les lettres non ASCII, choisissez URL complète. Pour des données qui seront lues comme l’envoi d’un formulaire HTML, choisissez Formulaire.
  3. Cliquez sur Encoder ou Décoder. Avec Une valeur par ligne cochée, chaque ligne est traitée séparément : vous pouvez convertir d’un coup toute une liste de paramètres ou d’URL.
  4. Copiez le résultat, ou cliquez sur Utiliser le résultat comme entrée pour le retraiter, par exemple pour défaire une valeur encodée deux fois.

Quand vous décodez une URL complète qui contient une chaîne de requête, l’outil liste aussi chaque nom et chaque valeur de paramètre en clair : c’est le moyen le plus rapide de lire une longue URL de suivi ou de redirection.

Ce qu’est l’encodage en pourcentage

Une URL ne peut contenir qu’un jeu restreint de caractères ASCII, et plusieurs d’entre eux ont un rôle : ? ouvre la requête, & sépare les paramètres, # ouvre le fragment, / sépare les segments du chemin. L’encodage en pourcentage est la porte d’entrée de tout le reste. Chaque caractère est converti en ses octets UTF-8, et chaque octet s’écrit % suivi de deux chiffres hexadécimaux. Une espace tient sur un octet : elle devient %20 ; é en occupe deux, %C3%A9 ; un émoji comme 😀 en occupe quatre, %F0%9F%98%80. Le décodage fait le chemin inverse.

Les règles viennent de la RFC 3986, section 2 (en anglais), la norme qui définit la syntaxe des URI. Elle recommande des chiffres hexadécimaux en majuscules (%3A, pas %3a), demande de convertir d’abord le texte en octets UTF-8, et avertit qu’une même chaîne ne doit jamais être encodée ni décodée plus d’une fois.

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

La RFC 3986 répartit les caractères autorisés dans une URL en deux groupes :

  • Non réservés : les lettres A–Z a–z, les chiffres 0–9 et - . _ ~. Ils n’ont jamais besoin d’être encodés et signifient la même chose encodés ou non.
  • Réservés : les délimiteurs généraux : / ? # [ ] @ et les sous-délimiteurs ! $ & ' ( ) * + , ; =. Ils peuvent porter la structure de l’URL : dès qu’un de ces caractères fait partie de vos données et non de la syntaxe de l’URL, il doit être encodé en pourcentage.

Tout le reste, y compris les espaces, le % lui-même, les guillemets, les chevrons et tous les caractères non ASCII, n’est pas autorisé tel quel dans une URL et doit toujours être encodé. Les cas les plus courants :

CaractèreEncodéPourquoi c’est important
espace%20 (ou + dans les données de formulaire)Interdite dans une URL
&%26Ouvrirait un nouveau paramètre de requête
=%3DSéparerait le nom d’un paramètre de sa valeur
?%3FOuvrirait la chaîne de requête
#%23Ferait passer tout ce qui suit dans le fragment, qui n’est jamais envoyé au serveur
/%2FCréerait un segment de chemin supplémentaire
+%2BLu comme une espace dans les chaînes de requête encodées en formulaire
%%25Serait lu comme le début d’une séquence d’échappement
: @%3A %40Délimitent le schéma, les identifiants et l’hôte
é%C3%A9Non ASCII, encodé sous la forme de ses deux octets UTF-8

Composant, URL complète, RFC 3986 ou formulaire : lequel choisir

Une même entrée s’encode différemment selon la destination du résultat. Pour l’entrée Tom & Jerry's (2024)/ü :

  • Composant donne Tom%20%26%20Jerry's%20(2024)%2F%C3%BC. C’est encodeURIComponent de JavaScript, qui encode tout sauf les lettres, les chiffres et - _ . ! ~ * ' ( ). À utiliser pour une valeur de requête, un segment de chemin, ou une URL que vous placez dans le paramètre d’une autre URL, comme une cible de redirection.
  • RFC 3986 strict donne Tom%20%26%20Jerry%27s%20%282024%29%2F%C3%BC. Il encode en plus ! ' ( ) *, que la RFC 3986 réserve comme sous-délimiteurs alors que encodeURIComponent les laisse tels quels. À utiliser quand un analyseur strict ou un schéma de signature de requêtes attend exactement le jeu de la RFC.
  • Formulaire donne Tom+%26+Jerry%27s+%282024%29%2F%C3%BC. Il suit le format application/x-www-form-urlencoded de la norme URL du WHATWG (en anglais) : seuls les lettres, les chiffres et * - . _ restent littéraux, et l’espace devient +. C’est ce qu’envoient un formulaire HTML et URLSearchParams.
  • URL complète donne Tom%20&%20Jerry's%20(2024)/%C3%BC. C’est encodeURI, qui laisse intacts ; / ? : @ & = + $ , # parce qu’il suppose qu’ils jouent déjà leur rôle dans une URL complète. À réserver au nettoyage d’une adresse entière qui contient des espaces ou du texte non ASCII. Ne l’utilisez jamais pour une valeur : un & dans une valeur ouvrirait silencieusement un nouveau paramètre.

%20 ou + : les espaces dans les URL

Deux conventions coexistent. Dans la syntaxe d’URL de la RFC 3986, une espace s’écrit toujours %20, et un + n’est qu’un signe plus. Dans le format d’encodage de formulaire que les navigateurs utilisent pour envoyer un formulaire en GET, l’espace s’écrit +, et l’analyseur WHATWG de ce format remplace chaque + par une espace avant de décoder les pourcentages. Ainsi, ?q=a+b signifie « a b » pour un analyseur de données de formulaire, alors que /a+b dans un chemin signifie « a+b ».

C’est pourquoi le décodeur propose l’option Traiter + comme une espace. Cochez-la pour les chaînes de requête produites par des formulaires, des champs de recherche et la plupart des outils d’analyse. Laissez-la décochée pour les chemins et pour les valeurs où le plus est réel, comme une adresse e-mail du type nom+tag@example.com, qui s’encode nom%2Btag%40example.com.

La même chose dans le code

  • JavaScript : encodeURIComponent() et decodeURIComponent() pour les valeurs, encodeURI() pour les URL entières, et URLSearchParams pour les chaînes de requête de type formulaire avec des espaces en + (voir MDN).
  • Python : urllib.parse.quote() laisse / intact par défaut et écrit les espaces en %20, pour les chemins ; quote_plus() encode / et écrit les espaces en +, pour les valeurs de formulaire (voir la documentation Python).
  • PHP : rawurlencode() suit la RFC 3986 et écrit les espaces en %20 ; urlencode() les écrit en + (voir le manuel PHP).

Problèmes courants d’encodage d’URL

Double encodage : %2520 au lieu de %20

Si une URL contient %2520, %253A ou une séquence semblable, quelque chose a encodé une chaîne déjà encodée ; %25 est le signe pourcent encodé. Décodez une fois et regardez le résultat. L’outil vous prévient quand le résultat décodé contient encore des séquences en pourcentage, et Utiliser le résultat comme entrée permet de décoder la couche suivante. Côté code, la solution est d’encoder chaque valeur une seule fois, au moment de construire l’URL.

Erreurs « Malformed URI sequence »

Les décodeurs stricts rejettent un % qui n’est pas suivi de deux chiffres hexadécimaux, ainsi que les suites d’octets qui ne sont pas de l’UTF-8 valide. Ce décodeur est au contraire tolérant : il décode toutes les séquences valides, laisse tel quel un % isolé, remplace les octets invalides par le caractère de remplacement � et vous le signale, pour que vous puissiez trouver l’endroit abîmé au lieu de n’obtenir rien du tout.

Une valeur coupée au # ou au &

Si un paramètre arrive tronqué, sa valeur contenait un # ou un & non encodé, généralement parce que l’URL a été assemblée par concaténation de chaînes ou avec l’encodage URL complète. Encodez la valeur en mode Composant.

Encoder toute une URL la casse

Passer une URL complète en mode Composant transforme https:// en https%3A%2F%2F. C’est correct seulement si l’URL est elle-même une valeur de paramètre à l’intérieur d’une autre URL. Sinon, n’encodez que la partie que vous insérez, ou utilisez le mode URL complète.

Outils d’URL associés

Construisez des liens de campagne complets avec le générateur UTM, retirez les paramètres de suivi avec le nettoyeur d’URL, ou voyez chaque étape d’un lien avec le vérificateur de redirection. Pour transformer un script en favori de navigateur actif en un clic, le générateur de bookmarklets l’encode en pourcentage à votre place. Et si vous gardez des pages de référence comme cette RFC pendant que vous travaillez, Marqly les range dans une seule bibliothèque où tout se retrouve par la recherche : voyez Marqly pour les développeurs.

Questions fréquentes

À quoi sert l’encodage d’URL ?

Il remplace les caractères non sûrs ou porteurs d’un sens particulier dans une URL par un signe pourcent suivi de deux chiffres hexadécimaux pour chaque octet UTF-8. Une espace devient %20, & devient %26 et é devient %C3%A9. Ainsi, n’importe quel texte peut voyager dans une URL sans être confondu avec la structure de l’adresse elle-même.

Quelle différence entre encodeURI et encodeURIComponent ?

encodeURIComponent encode tout sauf les lettres, les chiffres et - _ . ! ~ * ' ( ), ce qui en fait le bon choix pour une valeur de paramètre ou un segment de chemin. encodeURI laisse aussi intacts ; / ? : @ & = + $ , #, car il suppose que vous lui passez une URL complète et déjà structurée. Utilisez le mode Composant pour les valeurs, et le mode URL complète seulement pour des adresses entières.

Une espace doit-elle s’écrire %20 ou + ?

Les deux sont corrects, mais pas aux mêmes endroits. %20 fonctionne partout dans une URL. Le signe + ne signifie une espace que dans les chaînes de requête encodées en formulaire (application/x-www-form-urlencoded), c’est-à-dire ce que produisent les formulaires HTML et URLSearchParams. Dans un chemin, un + est un simple plus. Pour décoder une chaîne de requête issue d’un formulaire, cochez Traiter + comme une espace.

Pourquoi mon URL contient-elle %2520 ?

Elle a été encodée deux fois. Le premier passage a transformé l’espace en %20 ; le second a encodé le % lui-même en %25, d’où %2520. La RFC 3986 précise qu’une même chaîne ne doit pas être encodée ni décodée plus d’une fois. Décodez une fois pour vérifier que %20 réapparaît, puis décodez à nouveau.

Peut-on encoder ou décoder plusieurs URL à la fois ?

Oui. Collez une valeur par ligne et laissez cochée l’option Une valeur par ligne. Chaque ligne est encodée ou décodée séparément : les retours à la ligne sont conservés au lieu de devenir %0A.

Quels caractères faut-il encoder ?

Tout ce qui sort du jeu de caractères non réservés de la RFC 3986 (lettres, chiffres, trait d’union, point, tiret bas, tilde) doit être encodé quand il fait partie d’une valeur et non de la structure de l’URL. Cela inclut les espaces, les lettres non ASCII, le %, ainsi que les délimiteurs réservés comme ? # & = / : @ et +.

Mon texte est-il envoyé quelque part ?

Non. L’encodage, le décodage et le détail de la chaîne de requête s’exécutent dans votre navigateur avec les fonctions JavaScript natives. Rien n’est transmis à un serveur.

← Outils gratuits

Accueil · Marqly