URLエンコードとは?
URLエンコード(パーセントエンコーディング)とは、URLに含められない文字を「%」と16進数の組み合わせに変換する仕組みです。たとえば、半角スペースは「%20」、日本語の「あ」はUTF-8で「%E3%81%82」のように変換されます。これにより、本来URLで使えない文字を安全に送受信できるようになります。
URLで使用できる文字はRFC 3986によって定められており、英字(A-Z, a-z)、数字(0-9)、および一部の記号(- _ . ~)のみが「非予約文字」として、そのまま使用できます。それ以外の文字(日本語、中国語、特殊記号など)はすべてパーセントエンコーディングによる変換が必要です。
なぜURLエンコードが必要なのか
予約文字の衝突を防ぐ
URLには構造上の意味を持つ予約文字があります。たとえば「?」はクエリ文字列の開始、「&」はパラメータの区切り、「/」はパスの区切りを意味します。もしクエリパラメータの値に「&」がそのまま含まれていると、ブラウザはそれを区切り文字と誤認してしまいます。エンコードすることで、文字そのものとしての意味と構造上の意味を区別できます。
非ASCII文字の送信
URLの仕様上、日本語や韓国語、アラビア文字などの非ASCII文字をそのまま含めることはできません。これらの文字をURLに含めるには、まずUTF-8でバイト列に変換し、各バイトを「%XX」形式にエンコードする必要があります。ブラウザのアドレスバーでは日本語がそのまま表示されることがありますが、実際の通信ではエンコードされた形式で送信されています。
encodeURIとencodeURIComponentの違い
JavaScriptには2つのエンコード関数があり、用途に応じた使い分けが重要です。
encodeURIComponent(コンポーネント)
クエリパラメータの値やパスの一部分など、URLの「部品」をエンコードする場合に使います。「:」「/」「?」「#」「&」「=」などの予約文字もすべてエンコードされるため、値に含まれるこれらの文字がURL構造を壊すことがありません。最も使用頻度が高く、API連携やフォーム送信で標準的に利用されます。
encodeURI(URL全体)
URLの全体構造を保ったままエンコードする場合に使います。「:」「/」「?」「#」などの予約文字はエンコードされず、URLとしての構造が維持されます。すでに組み立てられたURLに含まれる日本語などの非ASCII文字だけを変換したい場合に適しています。
よくある利用場面
クエリパラメータの生成
検索機能やフィルタリングなど、URLのクエリパラメータにユーザー入力を含める場合、エンコードは必須です。たとえば「東京 渋谷」という検索語をクエリパラメータにする場合、「?q=%E6%9D%B1%E4%BA%AC%20%E6%B8%8B%E8%B0%B7」のようにエンコードして送信します。
日本語ファイル名の処理
Webサーバー上の日本語ファイル名を含むURLを正しく扱うには、ファイル名部分のエンコードが必要です。メール本文やチャットにURLを貼り付ける際、日本語が含まれていると途中でリンクが切れてしまうことがありますが、エンコードすることでこの問題を回避できます。
API連携・データ送信
REST APIに対してGETリクエストを送信する場合、パラメータの値はURLエンコードする必要があります。特にJSON文字列や特殊記号を含むデータをクエリパラメータとして送信する場合、エンコードを忘れるとサーバー側で正しく解析できず、エラーの原因となります。
RFC 3986とURL仕様
RFC 3986は、URI(Uniform Resource Identifier)の構文を定めた標準仕様です。この規格により、URLで使用できる文字が厳密に定義されています。非予約文字(英数字と「-」「_」「.」「~」)はエンコード不要ですが、それ以外の文字はパーセントエンコーディングが必要です。また、UTF-8がエンコードの標準文字コードとして推奨されており、現代のWebブラウザやサーバーはこれに準拠しています。