パーセントエンコーディング(Percent-encoding)は、URI(Uniform Resource Identifier)において、使用できない文字を扱うために用いられるエンコード方式の一つです。これは、URLエンコードとも呼ばれることがあります。URLでは、特定の文字が予約されており、そのまま使用するとURLの構造を壊してしまう可能性があります。そのため、これらの文字を安全にURLに含めるために、パーセントエンコーディングが必要となります。
パーセントエンコーディングは、特定の文字を「%」記号と、それに続く2桁の16進数で表現します。この16進数は、その文字のバイト表現に対応します。例えば、半角
スペースはパーセントエンコーディングでは「%20」と表されます。
URL Standardでは、URLのパス部分を解析する際に、特定の文字集合(path percent-encode set)に含まれる文字を
UTF-8でエンコードした後、パーセントエンコーディングすることを規定しています。この文字集合には、C0制御文字、特定の記号、およびU+007Eより上位の文字が含まれます。
パーセントエンコードの対象となる文字の例
C0制御文字(U+0000からU+001F)
空白(U+0020)
二重引用符(U+0022)
番号記号(U+0023)
小なり記号(U+003C)
大なり記号(U+003E)
バッククオート(U+0060)
開き波括弧(U+007B)
閉じ波括弧(U+007D)
U+007Eより上位の文字全て
URLのユーザー情報やパスワード部分では、さらに多くの文字がパーセントエンコーディングの対象となります。
例えば、「ウィキペディア」という文字列を、異なる文字コードでパーセントエンコーディングすると以下のようになります。
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`
パーセントエンコーディングは、RFC 3986で定義されています。
application/x-www-form-urlencoded
HTTPのPOSTメソッドでWebフォームのデータを送信する際には、application/x-www-form-urlencodedというMIMEタイプが使用されます。この場合にも、URLエンコードが行われますが、パーセントエンコーディングとは少し異なるルールが適用されます。
application/x-www-form-urlencodedでは、半角スペースは「%20」ではなく「+」にエンコードされます。また、複数のフォーム項目を送信する際には、各項目は「&」記号で区切られます。
このエンコード方式は、URL Standardの5章で定義されています。標準ドキュメントとしてはRFC 1866 HTML 2.0のSection 8.2.1が初出です。
まとめ
パーセントエンコーディングは、URLで安全に文字を表現するための重要なメカニズムです。URIで使用できない文字を「%」と16進数で表すことで、URLの構造を維持しながら様々な文字を扱うことができます。また、Webフォームのデータ送信に用いられるapplication/x-www-form-urlencodedは、パーセントエンコーディングとは異なる規則に従いますが、URLエンコードの一種と見なすことができます。
参考情報
URL Standard
Uniform Resource Identifier (URI): Generic Syntax
関連事項
Internationalized Resource Identifier (IRI)
* Punycode