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エンコード・デコードの方法を紹介します。
- JavaScript:
encodeURIComponent(str)/decodeURIComponent(str) - Python:
from urllib.parse import quote, unquote - PHP:
urlencode($str)/urldecode($str) - Go:
url.QueryEscape(str)/url.QueryUnescape(str)
encodeURIとencodeURIComponentの違い
JavaScriptには2種類のエンコード関数があり、用途が異なります。
- encodeURI:URL全体をエンコード。
://や/など、URL構造に必要な文字はエンコードしない。 - encodeURIComponent:URLの一部(クエリパラメータの値など)をエンコード。
?&=/もエンコードするため、パラメータ値のエンコードに適している。
クエリパラメータの値をエンコードする場合はencodeURIComponentを使うのが正解です。
実務での注意点
- 二重エンコードに注意。すでにエンコード済みの文字列を再度エンコードすると、
%が%25になり壊れる - APIのクエリパラメータとして日本語を渡す際は必ずエンコードする
- URLをログに記録する場合、デコードして人間が読みやすい形にすると運用が楽になる