URLエンコードとは、通常URLで使用できない文字列を「%2F%24…」といった16進数に符号化する処理のことです。
符号化する方法には、「パーセントエンコーディングによる符号化」と「application/x-www-form-urlencodedによる符号化」の2種類があります。
なお、半角スペースは、パーセントエンコーディングでは「%20」に符号化されますが、application/x-www-form-urlencodedによる符号化では「+」に符号化されます。
URIの規則を定める RFC 3986 では、URIに非予約文字 (Unreserved Characters)*1でもなく、また、URIの構文を示すために用いている予約文字 (Reserved Characters)*2でもない文字を用いる場合には、その文字の代わりに「%xx」(xxは16進数)という形のコードを表記することが定められています。
その際に、日本語の文字などで、どの符号化を用いるかは環境によって異なります。
なお、マルチバイト文字はバイト単位で変換し、Shift_JISの2バイト目など、バイトが非予約文字に対応するなら、その文字をそのまま使用しても良いです。
例えば「トゥインクル」を、各種の文字コードを用いてパーセントエンコーディングで符号化すると以下のようになります。
文字コード | エンコード結果 |
Shift_JIS | %83g%83D%83C%83%93%83N%83%8b |
EUC-JP | %a5%c8%a5%a5%a5%a4%a5%f3%a5%af%a5%eb |
UTF-8 | %e3%83%88%e3%82%a5%e3%82%a4%e3%83%b3%e3%82%af%e3%83%ab |
パーセントエンコーディングとは、URIにおいて使用できない文字を使う際に行われるエンコード(一種のエスケープ)の名称です。
「RFC 3986 の Section 2.1」で定義されており、一般にURLエンコードとも称されます。
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する必要があります。
また、複数のフォーム項目を送信する場合、各項目は「&」(アンパサンド)区切りで送信されます。
半角スペースは「+」になります。
<?php urlencode($str); ?> // urlencode(" "); ⇒ +
半角スペースは「%20」になります。
なお、rawurlencodeでは「RFC 1738」や「RFC 3986」で定められたエンコーディング方法を採用しています。
また、PHP 5.3.0 より前のバージョンでは、チルダ「~」もエンコードしていました。これは「RFC 1738」で定められた方法です。
<?php rawurlencode($str); ?> // rawurlencode(" "); ⇒ %20