パーセントエンコーディング(英:percent encoding)

パーセントエンコーディングとは、特別な意味を持つ文字、使用を禁止されている文字、およびバイナリデータを、無害な文字に置き換える手法の一つ。%(パーセント記号)を用いることから、このように呼ばれる。主にURI(Uniform Resource Identifier)などで使用される。

パーセントエンコーディングの例

例えば、 URI 中で スペース の使用は許可されていない。そのため、パーセントエンコーディング を用いて、次のように表現する。
パーセントエンコーディング前
https://curict.com/news list/ 

パーセントエンコーディング後
https://curict.com/news%20list/ 

パーセントエンコーディングの書式

%<0 ~ 9 または A ~ F><0 ~ 9 または A ~ F>

パーセントエンコーディングの例

%23       -> #
%3D       -> =
%7B%7D    -> {}

3文字1セットで、% 記号の後に、2文字の 0-9 または A-F が続く。 小文字アルファベットも使用できる場合が多いが、正確には大文字アルファベットを用いる。

数字とアルファベットは 文字コードを 16進数 で表現したもので、例えば 記号 = の 文字コードを 16進数であらわすと 3D となる。これに % 記号を付与し、%3D とする。

多バイト文字のパーセントエンコーディング

多バイト文字 の場合、文字コードを 1バイト(2桁の16進数)ごとに 分割して処理を行う。
  1. 対象文字の文字コードを確認する。
  2. 文字コードを 1バイト毎に 分割する
  3. 分割した文字コードを 2桁の 16進数にする。
  4. 分割した文字コードをASIIコードを用いて、文字に変換する。
  5. 手順 4. で変換した文字の使用が許されている場合、その文字を採用する。
  6. 手順 4. で変換した文字の使用が許されていない場合、手順 3. の 16進数に % を付与する。
例1. 文字 あ(UTF-8) の場合
  1. あ の UTF-8での文字コードは 16進数 で 0xE38182
  2. 1バイトごとに分割すると、E3,81,82
  3. E3,81,82 は、ASCIIコードで対応する文字は無い。
  4. そのまま % を付与 -> %E3%81%82
例2. 文字 あ(SJIS) の場合
  1. あ の SJIS での文字コードは 16進数 で 0x82A0
  2. 1バイトごとに分割すると、82 と A0
  3. 82 と A0 は、ASCIIコードで対応する文字は無い。
  4. そのまま % を付与 -> %82%A0
例3. 文字 ア(SJIS) の場合
  1. ア の SJIS での文字コードは、0x8341
  2. 1バイトごとに分割すると、83 と 41
  3. 83は、ASCIIコードで対応する文字は無いため、%83 とする。
  4. 41 は ASCIIコードで A に相当するため、A を採用する。
  5. 結果、%83A となる。

特別な意味を持つ文字 や 使用できない文字

特別な意味を持つ文字 や 使用できない文字は、パーセントエンコーディング を行う対象によって異なる。また、特別な変換ルールを用いることもある。

パーセントエンコーディング を採用する技術

URI(Uniform Resource Identifier)

URI は Uniform Resource Identifier の略で、リソースを一意に識別するための方法をルール化したもの。主にインターネット上の資源を特定する際に用いられ、URL(Uniform Resource Locator) と URN(Uniform Resource Name) から構成される。

URI では次の文字が 予約語 として扱われ、特別な意味を持つ。URI に 予約語 や 多バイト文字 を含めるには、パーセントエンコーディング を行う。

URIの予約語一覧
文字 説明 文字コード パーセントエンコード結果
: コロン / colon 0x3A %3A
/ スラッシュ / slash 0x2F %2F
? 疑問符 / question mark 0x3F %3F
# 番号記号 / number sign 0x23 %23
[ 始め大括弧 / left square bracket 0x5B %5B
] 終わり大括弧 / right square bracket 0x5D %5D
@ 単価記号 / commercial at 0x40 %40
! 感嘆符 / exclamation mark 0x21 %21
$ ドル記号 / dollar sign 0x24 %24
& アンパサンド / ampersand 0x26 %26
' シングルクォート / single quote 0x27 %27
( 始め小括弧 / left parenthesis 0x28 %28
) 終わり小括弧 / right parenthesis 0x29 %29
* アスタリスク / asterisk 0x2A %2A
+ プラス記号 / plus sign 0x2B %2B
, カンマ / comma 0x2C %2C
; セミコロン / semicolon 0x3B %3B
= 等号 / equals 0x3D %3D
% パーセント記号 / percent sing 0x25 %25
スペース / space 0x20 %20

Content-Type: application/x-www-form-urlencoded

application/x-www-form-urlencodedは、HTMLフォームからWebサーバーへデータを送信する際のデータ形式(Content-Type)の一つ。送信方法には GET と POST の2種類があり、GET の場合は URI の末尾に クエリ文字列(クエリストリング) が付与される。

例えば次のような URL があるとき、「?q=percent+encoding」の部分が クエリ文字列である。

https://www.google.com/search?q=percent+encoding
「?」は クエリ文字列の開始を表し、「q」がパラメーター名、「=」のあとに「パラメーター値」が続く。 (? は 厳密には区切り文字で、クエリ文字列には含まれない。)

application/x-www-form-urlencoded では、パラメーター名 と パラメーター値 に対して パーセントエンコーディング を用いる。このとき、スペース は +記号 または %20 に置き換える。

例に示した「percent+encoding」を エンコード前の値に戻すと、「percent encoding」となる。

同意語

参考資料