Comment encoder et décoder des URL

· 7 min de lecture

Si vous avez deja vu %20 dans une URL ou un espace devrait etre, ou %C3%A9 ou un caractere accentue devrait apparaitre, vous avez rencontre l'encodage URL. C'est une partie fondamentale du fonctionnement du web, et le comprendre vous aide a deboguer les liens brises, les problemes d'API et les soumissions de formulaires. Un encodeur base sur navigateur gere tout le travail localement sans televerser vos donnees sur un serveur.

Ce que fait l'encodage URL

Les URL ne peuvent contenir en toute securite qu'un ensemble limite de caracteres : lettres (A-Z, a-z), chiffres (0-9) et quelques caracteres speciaux (-, _, ., ~). Tout le reste (espaces, caracteres accentues, emoji, et symboles comme &, =, #, ?) doit etre converti en un format securise.

L'encodage URL (aussi appele encodage pourcent) remplace les caracteres non securises par un % suivi de leurs valeurs d'octet hexadecimales :

CaractereEncode
Espace%20
&%26
=%3D
#%23
?%3F
/%2F
@%40
:%3A
+%2B
,%2C
;%3B
(saut de ligne)%0A
(tabulation)%09

Quand vous avez besoin d'encodage URL

Comment encoder et decoder

  1. Choisissez encoder ou decoder : selectionnez la direction. Choisissez encodeURIComponent pour les parametres de requete ou encodeURI pour les URL completes.
  2. Collez votre entree : entrez le texte ou l'URL. Le resultat se met a jour instantanement.
  3. Copiez la sortie : utilisez le resultat dans votre code, requete API ou navigateur.

Une breve histoire de l'encodage URL

L'encodage URL a ete defini par le RFC 1738 en decembre 1994, parallelement a la specification URL originale. Le RFC a ete redige par Tim Berners-Lee (inventeur du web) avec la contribution du groupe de travail URI de l'IETF. Le schema d'encodage original utilisait des valeurs d'octet ASCII : chaque caractere reserve ou non securise etait encode comme % suivi de deux chiffres hexadecimaux.

L'encodage a ete mis a jour plusieurs fois :

Le plus grand changement a ete le passage a UTF-8 dans le RFC 3986. Avant cela, les URL encodees etaient ASCII uniquement, et les caracteres non latins necessitaient des solutions de contournement (Punycode pour les domaines, IDN pour les adresses internationales). Aujourd'hui, un «é» accentue dans une URL s'encode en %C3%A9 (ses deux octets UTF-8), pas l'octet Latin-1 %E9 que les anciens systemes produiraient.

encodeURI vs encodeURIComponent vs encodeURIFull

JavaScript a trois fonctions d'encodage avec un comportement subtilement different :

FonctionCe qu'elle encodeCe qu'elle preserveUtiliser pour
encodeURI()Tous les caracteres non securisesSyntaxe URL : : / ? & = #Encoder des URL entieres
encodeURIComponent()Tous les caracteres non securises y compris la syntaxe URLSeulement A-Z a-z 0-9 - _ . ~ ! * ' ( )Valeurs de parametres de requete
escape() (depreciee)La plupart des caracteres non securisesLatin-1 uniquementNe pas utiliser

En Python :

Dans d'autres langages :

LangageEncodage de composantEncodage URI complet
JavaURLEncoder.encode() (avec des reserves autour de +)URI.toASCIIString()
C#Uri.EscapeDataStringUri.EscapeUriString
RubyCGI.escape()URI.encode_www_form_component
PHPrawurlencode()urlencode() (note : %2B vs +)
Gourl.QueryEscape()url.PathEscape()
Rustcrate percent_encodingcrate percent_encoding

Pieges courants

Exemples travailles

EntreeencodeURIencodeURIComponent
hello worldhello%20worldhello%20world
q=test&page=1q=test&page=1q%3Dtest%26page%3D1
https://x.com/pathhttps://x.com/pathhttps%3A%2F%2Fx.com%2Fpath
caf écaf%20%C3%A9caf%20%C3%A9
中文%E4%B8%AD%E6%96%87%E4%B8%AD%E6%96%87
100%100%25100%25
email@test.comemail@test.comemail%40test.com

Conseils

Confidentialite et URL sensibles

L'encodeur et le decodeur URL s'executent entierement dans votre navigateur. Les URL que vous collez, le traitement intermediaire et la sortie encodee/decodee restent tous sur votre appareil. Rien n'est televerse sur un serveur, enregistre ou partage avec qui que ce soit.

Cela importe car les URL contiennent frequemment des donnees extremement sensibles : cles et tokens d'API dans les parametres de requete, codes d'autorisation OAuth qui accordent l'acces au compte, ID de session, URL signees pour des compartiments S3 prives avec identifiants integres, tokens de connexion par lien magique, URL de reinitialisation de mot de passe, URL internes d'administration qui revelent la structure du produit, adresses e-mail des clients dans les liens de desabonnement, donnees personnelles dans les soumissions de formulaires. Les encodeurs URL en nuage enregistrent chaque collage, les conservent parfois pour «amelioration du service», et ont ete impliques dans de vraies fuites ou des tokens d'authentification colles ont ete extraits par des attaquants surveillant les journaux. Un encodeur base sur navigateur a une exposition nulle : l'URL ne quitte jamais votre machine.

L'encodage base sur navigateur fonctionne aussi hors ligne une fois la page chargee, utile pour encoder des URL dans les avions, dans des environnements securises sans acces internet, ou partout ou vous ne pouvez pas ou ne devriez pas coller des URL portant l'authentification dans un service tiers.

Questions fréquentes

Quelle est la différence entre encodeURI et encodeURIComponent ?

encodeURI préserve les caractères valides dans une structure d'URL (barres, deux-points, points d'interrogation). encodeURIComponent encode tout sauf les lettres, les chiffres et quelques caractères sûrs. Utilisez encodeURIComponent pour les valeurs de paramètres de requête, encodeURI pour les URL complètes.

Pourquoi les espaces deviennent-ils %20 ou + ?

Dans l'encodage d'URL, les espaces deviennent %20. Dans les données de formulaire (application/x-www-form-urlencoded), les espaces deviennent +. Les deux sont valides dans leurs contextes, mais %20 est le standard universel pour les URL.

Dois-je encoder mes URL manuellement ?

Dans la plupart des cas, votre langage ou framework s'occupe de l'encodage automatiquement. L'encodage manuel est utile quand vous construisez des URL à la main, déboguez des requêtes d'API ou travaillez avec des chaînes de requête contenant des caractères spéciaux.

Mes données sont-elles envoyées sur un serveur ?

Non. Tout l'encodage et le décodage se font dans votre navigateur.