パーセントエンコードされたURLの解析とデコード

URLパーセントエンコーディング(URLエンコーディング)を理解し、URLで特殊文字がどのようにエスケープされるか、encodeURIとencodeURIComponentの使い分け、エンコードされたURLを正しくデコードする方法を学びます。

Query Parameters

詳細な説明

URLパーセントエンコーディング

パーセントエンコーディング(URLエンコーディングとも呼ばれる)は、安全でない文字を%の後に文字のバイト値を表す2桁の16進数で置き換えます。これによりURLが有効なASCII文字のみを含むことが保証されます。

仕組み

元の値:     https://example.com/search?q=hello world&lang=日本語
エンコード: https://example.com/search?q=hello%20world&lang=%E6%97%A5%E6%9C%AC%E8%AA%9E

予約文字と非予約文字

非予約文字(エンコード不要):

A-Z  a-z  0-9  -  _  .  ~

予約文字(URLで特別な意味を持つ):

:  /  ?  #  [  ]  @  !  $  &  '  (  )  *  +  ,  ;  =

JavaScriptエンコーディング関数

関数 エンコードする エンコードしない
encodeURI() スペース、非ASCII : / ? # [ ] @ ! $ & ' ( ) * + , ; =
encodeURIComponent() ほぼすべて A-Z a-z 0-9 - _ . ~ ! ' ( ) *

いつどちらを使うか

  • encodeURI() — 完全なURLをエンコードする場合(URL構造を保持)
  • encodeURIComponent() — 単一のパラメータ値をエンコードする場合
  • URLSearchParams — クエリパラメータのエンコーディングを自動処理

よくあるエンコーディングの落とし穴

  1. 二重エンコード — すでにエンコードされたURLをエンコードすると%20の代わりに%2520が生成される
  2. +と%20 — クエリ文字列では+はスペースを意味。パスではリテラルなプラスを意味
  3. UTF-8マルチバイト — 非ASCII文字は複数の%XXシーケンスを生成
  4. デコードの不一致 — コンポーネントエンコードされた文字列にdecodeURI()を使用すると失敗する場合がある

ユースケース

URLエンコーディングはAPIリクエストの構築、リダイレクトURLの構成、URLでのユーザー生成コンテンツの処理、国際化ドメイン名の操作において重要です。エンコーディングの誤処理はバグの一般的な原因であり、壊れたリンク、失敗したAPI呼び出し、さらにはオープンリダイレクトなどのセキュリティ脆弱性が不正なURLエンコーディングから生じる可能性があります。

試してみる — URL Parser & Builder

フルツールを開く