URLエンコードとは

URLエンコード(パーセントエンコーディング)とは、URLの中で使用できない文字や特別な意味を持つ文字を、%XX形式(XXは16進数の文字コード)に変換する処理です。

たとえば「東京 観光」という文字列をURLで使う場合、スペースや日本語はそのまま使えないため、以下のようにエンコードされます。

東京 観光
↓
%E6%9D%B1%E4%BA%AC%20%E8%A6%B3%E5%85%89

エンコードが必要な文字

URLの仕様(RFC 3986)では、英数字と一部の記号(- _ . ~)以外はすべてエンコードが必要です。特に注意すべき文字を紹介します。

  • スペース%20(フォームデータでは+が使われることも)
  • &(アンパサンド)%26(クエリパラメータの区切り文字として特別な意味を持つ)
  • =(イコール)%3D(キーと値の区切り文字として特別な意味を持つ)
  • +(プラス)%2B
  • 日本語・中国語・絵文字:UTF-8でバイト列に変換後、各バイトを%XX形式で表現

エンコードとデコードの実装

各言語でのURLエンコード・デコードの方法を紹介します。

  • JavaScriptencodeURIComponent(str) / decodeURIComponent(str)
  • Pythonfrom urllib.parse import quote, unquote
  • PHPurlencode($str) / urldecode($str)
  • Gourl.QueryEscape(str) / url.QueryUnescape(str)

encodeURIとencodeURIComponentの違い

JavaScriptには2種類のエンコード関数があり、用途が異なります。

  • encodeURI:URL全体をエンコード。:///など、URL構造に必要な文字はエンコードしない。
  • encodeURIComponent:URLの一部(クエリパラメータの値など)をエンコード。?&=/もエンコードするため、パラメータ値のエンコードに適している。

クエリパラメータの値をエンコードする場合はencodeURIComponentを使うのが正解です。

実務での注意点

  • 二重エンコードに注意。すでにエンコード済みの文字列を再度エンコードすると、%%25になり壊れる
  • APIのクエリパラメータとして日本語を渡す際は必ずエンコードする
  • URLをログに記録する場合、デコードして人間が読みやすい形にすると運用が楽になる