各ASCII文字のパーセントエンコード形式、RFC 3986の予約文字、そして開発者向けの実用的なエンコードルール。
| Char | Decimal | Hex | URL Encoded | Name |
|---|---|---|---|---|
| 32 | 0x20 | %20 | Space | |
| ! | 33 | 0x21 | エンコード不要 | 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 | エンコード不要 | Single quote / Apostrophe |
| ( | 40 | 0x28 | エンコード不要 | Left parenthesis |
| ) | 41 | 0x29 | エンコード不要 | Right parenthesis |
| * | 42 | 0x2A | エンコード不要 | Asterisk |
| + | 43 | 0x2B | %2B | Plus sign |
| , | 44 | 0x2C | %2C | Comma |
| - | 45 | 0x2D | エンコード不要 | Hyphen / Minus |
| . | 46 | 0x2E | エンコード不要 | Period / Dot |
| / | 47 | 0x2F | %2F | Forward slash |
| 0 | 48 | 0x30 | エンコード不要 | Zero |
| 1 | 49 | 0x31 | エンコード不要 | |
| 2 | 50 | 0x32 | エンコード不要 | |
| 3 | 51 | 0x33 | エンコード不要 | |
| 4 | 52 | 0x34 | エンコード不要 | |
| 5 | 53 | 0x35 | エンコード不要 | |
| 6 | 54 | 0x36 | エンコード不要 | |
| 7 | 55 | 0x37 | エンコード不要 | |
| 8 | 56 | 0x38 | エンコード不要 | |
| 9 | 57 | 0x39 | エンコード不要 | 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 | エンコード不要 | Capital A |
| B | 66 | 0x42 | エンコード不要 | |
| C | 67 | 0x43 | エンコード不要 | |
| D | 68 | 0x44 | エンコード不要 | |
| E | 69 | 0x45 | エンコード不要 | |
| F | 70 | 0x46 | エンコード不要 | |
| G | 71 | 0x47 | エンコード不要 | |
| H | 72 | 0x48 | エンコード不要 | |
| I | 73 | 0x49 | エンコード不要 | |
| J | 74 | 0x4A | エンコード不要 | |
| K | 75 | 0x4B | エンコード不要 | |
| L | 76 | 0x4C | エンコード不要 | |
| M | 77 | 0x4D | エンコード不要 | |
| N | 78 | 0x4E | エンコード不要 | |
| O | 79 | 0x4F | エンコード不要 | |
| P | 80 | 0x50 | エンコード不要 | |
| Q | 81 | 0x51 | エンコード不要 | |
| R | 82 | 0x52 | エンコード不要 | |
| S | 83 | 0x53 | エンコード不要 | |
| T | 84 | 0x54 | エンコード不要 | |
| U | 85 | 0x55 | エンコード不要 | |
| V | 86 | 0x56 | エンコード不要 | |
| W | 87 | 0x57 | エンコード不要 | |
| X | 88 | 0x58 | エンコード不要 | |
| Y | 89 | 0x59 | エンコード不要 | |
| Z | 90 | 0x5A | エンコード不要 | Capital Z |
| [ | 91 | 0x5B | %5B | Left square bracket |
| \ | 92 | 0x5C | %5C | Backslash |
| ] | 93 | 0x5D | %5D | Right square bracket |
| ^ | 94 | 0x5E | %5E | Caret |
| _ | 95 | 0x5F | エンコード不要 | Underscore |
| ` | 96 | 0x60 | %60 | Backtick / Grave |
| a | 97 | 0x61 | エンコード不要 | Lowercase a |
| b | 98 | 0x62 | エンコード不要 | |
| c | 99 | 0x63 | エンコード不要 | |
| d | 100 | 0x64 | エンコード不要 | |
| e | 101 | 0x65 | エンコード不要 | |
| f | 102 | 0x66 | エンコード不要 | |
| g | 103 | 0x67 | エンコード不要 | |
| h | 104 | 0x68 | エンコード不要 | |
| i | 105 | 0x69 | エンコード不要 | |
| j | 106 | 0x6A | エンコード不要 | |
| k | 107 | 0x6B | エンコード不要 | |
| l | 108 | 0x6C | エンコード不要 | |
| m | 109 | 0x6D | エンコード不要 | |
| n | 110 | 0x6E | エンコード不要 | |
| o | 111 | 0x6F | エンコード不要 | |
| p | 112 | 0x70 | エンコード不要 | |
| q | 113 | 0x71 | エンコード不要 | |
| r | 114 | 0x72 | エンコード不要 | |
| s | 115 | 0x73 | エンコード不要 | |
| t | 116 | 0x74 | エンコード不要 | |
| u | 117 | 0x75 | エンコード不要 | |
| v | 118 | 0x76 | エンコード不要 | |
| w | 119 | 0x77 | エンコード不要 | |
| x | 120 | 0x78 | エンコード不要 | |
| y | 121 | 0x79 | エンコード不要 | |
| z | 122 | 0x7A | エンコード不要 | Lowercase z |
| { | 123 | 0x7B | %7B | Left curly brace |
| | | 124 | 0x7C | %7C | Pipe / Vertical bar |
| } | 125 | 0x7D | %7D | Right curly brace |
| ~ | 126 | 0x7E | エンコード不要 | 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'URLエンコーディングは、安全でないASCII文字をパーセント記号(%)とバイト値を表す2桁の16進数で置き換えます。例えば、スペースは%20または+になります。これにより、すべてのシステムおよびプロトコルでURLが有効であることが保証されます。
RFC 3986では、どの文字が「未予約」(A-Z, a-z, 0-9, -, _, ., ~)であり、エンコードなしで安全に使用できるかを定義しています。スペース、<、>、#、%、{、}、|、\、^、`、および非ASCII文字を含む他のすべての文字は、パーセントエンコードする必要があります。
%20はスペースのRFC 3986標準パーセントエンコーディングで、URLのどこでも機能します。スペースの+記号はapplication/x-www-form-urlencoded形式(HTMLフォーム)の一部で、パスではなくクエリ文字列でのみ有効です。
個々のクエリパラメータ値をエンコードするにはencodeURIComponent()を使用します:encodeURIComponent('hello world') → 'hello%20world'。URLの構造を保持しながら完全なURLをエンコードするにはencodeURI()を使用します。escape()は非推奨なので使用しないでください。