| Char | Decimal | Hex | URL Encoded | Name |
|---|---|---|---|---|
| 32 | 0x20 | %20 | Space | |
| ! | 33 | 0x21 | aucun encodage nécessaire | Exclamation mark |
| " | 34 | 0x22 | %22 | Double quote |
| # | 35 | 0x23 | %23 | Hash / Number sign |
| $ | 36 | 0x24 | %24 | Dollar sign |
| % | 37 | 0x25 | %25 | Percent sign |
| & | 38 | 0x26 | %26 | Ampersand |
| ' | 39 | 0x27 | aucun encodage nécessaire | Single quote / Apostrophe |
| ( | 40 | 0x28 | aucun encodage nécessaire | Left parenthesis |
| ) | 41 | 0x29 | aucun encodage nécessaire | Right parenthesis |
| * | 42 | 0x2A | aucun encodage nécessaire | Asterisk |
| + | 43 | 0x2B | %2B | Plus sign |
| , | 44 | 0x2C | %2C | Comma |
| - | 45 | 0x2D | aucun encodage nécessaire | Hyphen / Minus |
| . | 46 | 0x2E | aucun encodage nécessaire | Period / Dot |
| / | 47 | 0x2F | %2F | Forward slash |
| 0 | 48 | 0x30 | aucun encodage nécessaire | Zero |
| 1 | 49 | 0x31 | aucun encodage nécessaire | |
| 2 | 50 | 0x32 | aucun encodage nécessaire | |
| 3 | 51 | 0x33 | aucun encodage nécessaire | |
| 4 | 52 | 0x34 | aucun encodage nécessaire | |
| 5 | 53 | 0x35 | aucun encodage nécessaire | |
| 6 | 54 | 0x36 | aucun encodage nécessaire | |
| 7 | 55 | 0x37 | aucun encodage nécessaire | |
| 8 | 56 | 0x38 | aucun encodage nécessaire | |
| 9 | 57 | 0x39 | aucun encodage nécessaire | Nine |
| : | 58 | 0x3A | %3A | Colon |
| ; | 59 | 0x3B | %3B | Semicolon |
| < | 60 | 0x3C | %3C | Less-than |
| = | 61 | 0x3D | %3D | Equals sign |
| > | 62 | 0x3E | %3E | Greater-than |
| ? | 63 | 0x3F | %3F | Question mark |
| @ | 64 | 0x40 | %40 | At sign |
| A | 65 | 0x41 | aucun encodage nécessaire | Capital A |
| B | 66 | 0x42 | aucun encodage nécessaire | |
| C | 67 | 0x43 | aucun encodage nécessaire | |
| D | 68 | 0x44 | aucun encodage nécessaire | |
| E | 69 | 0x45 | aucun encodage nécessaire | |
| F | 70 | 0x46 | aucun encodage nécessaire | |
| G | 71 | 0x47 | aucun encodage nécessaire | |
| H | 72 | 0x48 | aucun encodage nécessaire | |
| I | 73 | 0x49 | aucun encodage nécessaire | |
| J | 74 | 0x4A | aucun encodage nécessaire | |
| K | 75 | 0x4B | aucun encodage nécessaire | |
| L | 76 | 0x4C | aucun encodage nécessaire | |
| M | 77 | 0x4D | aucun encodage nécessaire | |
| N | 78 | 0x4E | aucun encodage nécessaire | |
| O | 79 | 0x4F | aucun encodage nécessaire | |
| P | 80 | 0x50 | aucun encodage nécessaire | |
| Q | 81 | 0x51 | aucun encodage nécessaire | |
| R | 82 | 0x52 | aucun encodage nécessaire | |
| S | 83 | 0x53 | aucun encodage nécessaire | |
| T | 84 | 0x54 | aucun encodage nécessaire | |
| U | 85 | 0x55 | aucun encodage nécessaire | |
| V | 86 | 0x56 | aucun encodage nécessaire | |
| W | 87 | 0x57 | aucun encodage nécessaire | |
| X | 88 | 0x58 | aucun encodage nécessaire | |
| Y | 89 | 0x59 | aucun encodage nécessaire | |
| Z | 90 | 0x5A | aucun encodage nécessaire | Capital Z |
| [ | 91 | 0x5B | %5B | Left square bracket |
| \ | 92 | 0x5C | %5C | Backslash |
| ] | 93 | 0x5D | %5D | Right square bracket |
| ^ | 94 | 0x5E | %5E | Caret |
| _ | 95 | 0x5F | aucun encodage nécessaire | Underscore |
| ` | 96 | 0x60 | %60 | Backtick / Grave |
| a | 97 | 0x61 | aucun encodage nécessaire | Lowercase a |
| b | 98 | 0x62 | aucun encodage nécessaire | |
| c | 99 | 0x63 | aucun encodage nécessaire | |
| d | 100 | 0x64 | aucun encodage nécessaire | |
| e | 101 | 0x65 | aucun encodage nécessaire | |
| f | 102 | 0x66 | aucun encodage nécessaire | |
| g | 103 | 0x67 | aucun encodage nécessaire | |
| h | 104 | 0x68 | aucun encodage nécessaire | |
| i | 105 | 0x69 | aucun encodage nécessaire | |
| j | 106 | 0x6A | aucun encodage nécessaire | |
| k | 107 | 0x6B | aucun encodage nécessaire | |
| l | 108 | 0x6C | aucun encodage nécessaire | |
| m | 109 | 0x6D | aucun encodage nécessaire | |
| n | 110 | 0x6E | aucun encodage nécessaire | |
| o | 111 | 0x6F | aucun encodage nécessaire | |
| p | 112 | 0x70 | aucun encodage nécessaire | |
| q | 113 | 0x71 | aucun encodage nécessaire | |
| r | 114 | 0x72 | aucun encodage nécessaire | |
| s | 115 | 0x73 | aucun encodage nécessaire | |
| t | 116 | 0x74 | aucun encodage nécessaire | |
| u | 117 | 0x75 | aucun encodage nécessaire | |
| v | 118 | 0x76 | aucun encodage nécessaire | |
| w | 119 | 0x77 | aucun encodage nécessaire | |
| x | 120 | 0x78 | aucun encodage nécessaire | |
| y | 121 | 0x79 | aucun encodage nécessaire | |
| z | 122 | 0x7A | aucun encodage nécessaire | Lowercase z |
| { | 123 | 0x7B | %7B | Left curly brace |
| | | 124 | 0x7C | %7C | Pipe / Vertical bar |
| } | 125 | 0x7D | %7D | Right curly brace |
| ~ | 126 | 0x7E | aucun encodage nécessaire | Tilde |
| Function | Encodes | Leaves alone | Use for |
|---|---|---|---|
| encodeURIComponent() | Everything except A-Z a-z 0-9 - _ . ! ~ * ' ( ) | Alphanumerics + - _ . ! ~ * ' ( ) | Query param values, path segments |
| encodeURI() | Unsafe chars, preserves : / ? # [ ] @ ! $ & ' ( ) * + , ; = | Most URI structural chars | Full URLs |
| escape() ✗ | Non-ASCII + some ASCII (deprecated) | @ * / + | Never — deprecated, use encodeURIComponent |
// Encode a single query param value (most common)
encodeURIComponent('hello world!') // → 'hello%20world!'
encodeURIComponent('price=100&qty=2') // → 'price%3D100%26qty%3D2'
// Build a URL with params safely
const params = new URLSearchParams({ q: 'hello world', page: '2' });
const url = 'https://example.com/search?' + params.toString();
// → https://example.com/search?q=hello+world&page=2
// Decode percent-encoded string
decodeURIComponent('hello%20world') // → 'hello world'
// Python
import urllib.parse
urllib.parse.quote('hello world') # → 'hello%20world'
urllib.parse.quote_plus('hello world') # → 'hello+world'
urllib.parse.urlencode({'q': 'hello world'}) # → 'q=hello+world'Le cas d'utilisation le plus courant. Lors de la construction d'URL de recherche ou de requêtes API :
https://api.example.com/search?q=hello%20world&lang=en
Les formulaires HTML avec method="GET" encodent automatiquement les valeurs des champs dans l'URL. Les espaces deviennent + dans l'encodage de formulaire (légèrement différent de l'encodage en pourcentage).
Les noms de fichiers et identifiants de ressources dans les chemins d'URL nécessitent aussi un encodage. Un fichier nommé my report.pdf devient my%20report.pdf dans l'URL.
JavaScript :
encodeURIComponent('hello world & more')
// "hello%20world%20%26%20more"
decodeURIComponent('hello%20world')
// "hello world"
Python :
from urllib.parse import quote, unquote
quote('hello world & more')
# 'hello%20world%20%26%20more'
%20 en %2520encodeURI au lieu de encodeURIComponent — encodeURI ignore les caractères réservés qui comptent dans les valeurs de requête+ — Dans les URL, + peut signifier espace. Encodez les vrais signes plus en %2BL'encodage de formulaire (application/x-www-form-urlencoded) utilise + pour les espaces. L'encodage en pourcentage standard utilise %20. Les deux sont valides dans différents contextes.
L'encodage URL remplace les caractères ASCII non sûrs par un signe de pourcentage (%) suivi de deux chiffres hexadécimaux représentant la valeur d'octet. Par exemple, un espace devient %20 ou +. Cela garantit que les URLs sont valides sur tous les systèmes et protocoles.
RFC 3986 définit quels caractères sont 'non réservés' (A-Z, a-z, 0-9, -, _, ., ~) et peuvent être utilisés sans encodage. Tous les autres caractères — y compris les espaces, <, >, #, %, {, }, |, \, ^, ` et les caractères non ASCII — doivent être encodés par pourcentage.
%20 est le codage par pourcentage standard RFC 3986 d'un espace et fonctionne partout dans une URL. Le signe + pour les espaces fait partie du format application/x-www-form-urlencoded (formulaires HTML) et n'est valide que dans les chaînes de requête, pas dans les chemins.
Utilisez encodeURIComponent() pour encoder les valeurs individuelles des paramètres de requête : encodeURIComponent('hello world') → 'hello%20world'. Utilisez encodeURI() pour encoder une URL complète tout en préservant sa structure. N'utilisez jamais escape() — il est obsolète.