URL をエンコード・デコードする方法
URL の中でスペースがあるべき場所に %20 が見えたり、アクセント付き文字があるべき場所に %C3%A9 が見えたりしたことがあれば、それが URL エンコーディングです。Web の基本的な仕組みのひとつで、これを理解しているとリンク切れ、API の問題、フォーム送信のデバッグに役立ちます。
URL エンコーディングが行うこと
URL に含めることができるのは、限られた安全な文字だけです:アルファベット(A〜Z、a〜z)、数字(0〜9)、いくつかの特殊文字(-、_、.、~)。それ以外 — スペース、アクセント文字、絵文字、&、=、#、? のような記号 — は安全な形式に変換する必要があります。
URL エンコーディング(パーセントエンコーディングとも)は、安全でない文字を % とそのバイトの 16 進数値に置き換えます:
| 文字 | エンコード後 |
|---|---|
| スペース | %20 |
| & | %26 |
| = | %3D |
| # | %23 |
| ? | %3F |
| / | %2F |
| @ | %40 |
URL エンコーディングが必要なとき
- 特殊文字を含むクエリパラメータ —
price > 100 & category = shoesのようなクエリは URL で機能させるためにエンコードが必要です - URL 内の非ラテン文字 — 他言語の名前、都市名、コンテンツはエンコードする必要があります
- API リクエスト — 手動で API 呼び出しを組み立てるとき、パラメータの値はたいていエンコードが必要です
- デバッグ — URL がうまく動かないときに、デコードすると本当の値が見えてきます
エンコード・デコードの方法
- エンコードかデコードを選ぶ — 方向を選択します。クエリパラメータには encodeURIComponent、URL 全体には encodeURI を使ってください。
- 入力を貼り付ける — テキストや URL を入力します。結果はその場で更新されます。
- 結果をコピー — コード、API リクエスト、ブラウザで使用してください。
ヒント
- URL 全体ではなく値をエンコードする — URL 全体をエンコードすると、URL を構成するスラッシュやコロンもエンコードされてしまい、URL が壊れます。クエリパラメータ内の値だけをエンコードしましょう。
- 二重エンコードに注意 — すでにエンコード済みの文字列をエンコードすると
%2520のようなものが生成されます(%が%25になる)。URL がおかしく見えるときは、二重にエンコードされていないか確認してください。 - デバッグにはデコード — API リクエストが失敗したり URL が読みにくく見えたりするときは、デコードして実際の値を確認してください。たいてい問題がすぐに見えてきます。
- 言語の組み込み関数を使う — 本番コードでは、手動エンコードではなく
encodeURIComponent()(JavaScript)、urllib.parse.quote()(Python)、URLEncoder.encode()(Java)などを必ず使ってください。
よくある質問
encodeURI と encodeURIComponent の違いは何ですか?
encodeURI は URL 構造内の有効な文字(スラッシュ、コロン、クエスチョンマーク)を保持します。encodeURIComponent は文字、数字、いくつかの安全な文字以外をすべてエンコードします。クエリパラメータの値には encodeURIComponent、URL 全体には encodeURI を使ってください。
なぜスペースが %20 になったり + になったりするのですか?
URL エンコーディングではスペースは %20 になります。フォームデータ(application/x-www-form-urlencoded)ではスペースは + になります。それぞれの文脈ではどちらも有効ですが、%20 は URL の汎用的な標準です。
URL を手動でエンコードする必要がありますか?
ほとんどの場合、使用言語やフレームワークが自動的にエンコードしてくれます。手動エンコードが役立つのは、URL を手作業で組み立てるとき、API リクエストをデバッグするとき、特殊文字を含むクエリ文字列を扱うときです。
データはサーバーに送信されますか?
いいえ。すべてのエンコードとデコードはブラウザ内で行われます。