URLエンコーディングとパーセントエスケープシーケンス

RFC 3986で定義されているURLエンコーディング(パーセントエンコーディング)を理解しましょう。エスケープが必要な文字、encodeURIとencodeURIComponentの違い、URLでのUTF-8の扱いを解説します。

Web & HTML

詳細な説明

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

URLエンコーディングは、安全でない文字や予約文字をパーセント記号の後に2桁の16進数を付けたバイト値で置き換えます。RFC 3986で定義されたこのメカニズムにより、URLがすべてのシステムで有効に保たれます。

エンコードが必要な文字

URLには限られたASCII文字セットのみ含めることができます。それ以外はすべてパーセントエンコードが必要です:

  • 非予約文字(エンコード不要):A-Za-z0-9-_.~
  • 予約文字(デリミタとして使用されない場合にエンコード)::/?#[]@ など
  • その他すべての文字:スペース、非ASCII、制御文字

エンコーディングの仕組み

UTF-8表現の各バイトが %HH としてエンコードされます。

encodeURI vs encodeURIComponent

JavaScriptはこの2つの関数を提供しており、重要な違いがあります:

  • encodeURI() — 完全なURIをエンコードし、:/?#&= などのデリミタを保持。
  • encodeURIComponent() — 単一のURIコンポーネント(クエリパラメータ値)をエンコードし、すべての予約文字をエンコード。

クエリ値に encodeURI を使用するのはよくあるバグです — &= などの予約文字がエスケープされずに通過し、クエリ文字列構造が壊れます。

フォームエンコーディング

HTMLフォームはスペースを %20 ではなく + としてエンコードします。これはRFC 3986ではなくHTML仕様で定義された別のエンコーディングです。

二重エンコーディング

頻繁に起きるミスは、既にエンコードされたURLを再エンコードすることで、%20%2520 に変わります。入力が既にエンコードされているかどうか不明な場合は、まずデコードしてください。

ユースケース

URLエンコーディングは、クエリパラメータ付きAPIリクエストの構築、リダイレクトURLの構成、特殊文字を含む共有リンクの生成、国際化ドメイン名の処理、Webhookペイロードの処理、OAuth認証URLの構築、URLを構成または解析するあらゆるサーバーサイドまたはクライアントサイドコードに不可欠です。

試してみる — String Escape/Unescape

フルツールを開く