パーセントエンコーディング
パーセントエンコーディング(英: percent-encoding)とは、URIにおいて使用できない文字を使う際に行われるエンコード(一種のエスケープ)の名称である。RFC3986のSection 2.1で定義されている。一般にURLエンコードとも称される。
URLエンコードと言う用語は上記のパーセントエンコーディングによる符号化と以下に記述するapplication/x-www-form-urlencodedによる符号化の2種類がある。半角スペースはパーセントエンコーディングでは「%20」に符号化されるが、application/x-www-form-urlencodedによる符号化では「+」に符号化される。
概要
URIの規則を定める RFC 3986 では、URIに、非予約文字[1]でもなく、また、URIの構文を示すために用いている予約文字[2]でもない文字を用いる場合には、その文字の代わりに「%xx」(xxは16進数)という形のコードを表記することが定められている。その際に、日本語の文字などで、どの符号化を用いるかは環境によって異なる。
マルチバイト文字はバイト単位で変換する。Shift_JISの2バイト目など、バイトが非予約文字に対応するなら、その文字をそのまま使用しても良い。
たとえば「ウィキペディア」を、各種の文字コードを用いてパーセントエンコーディングで符号化すると以下のようになる。
- Shift_JIS - %83E%83B%83L%83y%83f%83B%83A
- EUC-JP - %A5%A6%A5%A3%A5%AD%A5%DA%A5%C7%A5%A3%A5%A2
- UTF-8 - %E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2
application/x-www-form-urlencoded
HTTPのPOSTメソッドでWebフォームの文字列を送信する場合に、文字列はエンコードして送信される。その際の符号化方法はMIMEのContent-Typeがapplication/x-www-form-urlencodedで指定される。この符号化方法はRFC1866のSection-8.2.1で定義されている。この符号化方法をURLエンコードと言うことがある。
application/x-www-form-urlencodedでは、半角スペース(ASCIIコード 20)は「+」に変換される。このため、バイナリデータをBase64経由で直接POSTすることはできず、下記の手順でBase64Urlに変換してPOSTする必要がある。
- BASE64でテキスト化
- "+"を"-"に置換
- "/"を"_"に置換
- POSTでデータを送信
- "-"を"+"に置換
- "_"を"/"に置換
- BASE64でバイナリに戻す
また、複数のフォーム項目を送信する場合、各項目は「&」(アンパサンド)区切りで送信される。
脚注
- ^ RFC 3986 では、ASCIIのコード範囲内の英字(大文字・小文字)、数字、ハイフン “-”、ピリオド “.”、アンダースコア “_”、チルダ “~”が非予約文字 (Unreserved Characters) である。
- ^ RFC 3986 では、ASCIIのコード範囲内のコロン “:”、スラッシュ “/”、疑問符 “?”、シャープ “#”、角括弧 “[”、“]”、単価記号 “@”、感嘆符 “!”、ドル記号・ペソ記号 “$”、アンパサンド “&”、アポストロフィー・シングルクオート “'”、丸括弧 “(”、“)”、アスタリスク “*”、正符号・加算記号 “+”、コンマ “,”、セミコロン “;”、等号 “=”が予約文字 (Reserved Characters) である。
参考文献
- RFC 1866 - Hypertext Markup Language - 2.0
- 8.2.1章 The form-urlencoded Media Typeでapplication/x-www-form-urlencodedによる符号化が定義されている。
- RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
- 2.1章 Percent-Encodingにパーセントエンコーディングが定義されている。