URLエンコード

URLエンコードとは

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エンコードとも称されます。

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する必要があります。

  1. BASE64でテキスト化
  2. "+"を"-"に置換
  3. "/"を"_"に置換
  4. POSTでデータを送信
  5. "-"を"+"に置換
  6. "_"を"/"に置換
  7. BASE64でバイナリに戻す

また、複数のフォーム項目を送信する場合、各項目は「&」(アンパサンド)区切りで送信されます。

PHPでの関数

urlencode 関数

半角スペースは「+」になります。

<?php urlencode($str); ?>
// urlencode(" "); ⇒ +

rawurlencode 関数

半角スペースは「%20」になります。

なお、rawurlencodeでは「RFC 1738」や「RFC 3986」で定められたエンコーディング方法を採用しています。

また、PHP 5.3.0 より前のバージョンでは、チルダ「~」もエンコードしていました。これは「RFC 1738」で定められた方法です。

<?php rawurlencode($str); ?>
// rawurlencode(" "); ⇒ %20

参考


*1 RFC 3986 では、ASCIIのコード範囲内の英字(大文字・小文字)、数字、ハイフン「-」、ピリオド「.」、アンダースコア「_」、チルダ「~」が非予約文字です。
*2 RFC 3986 では、ASCIIのコード範囲内のコロン「:」、スラッシュ「/」、疑問符「?」、シャープ「#」、角括弧「[]」、単価記号「@」、感嘆符「!」、ドル記号・ペソ記号「$」、アンパサンド「&」、アポストロフィー・シングルクオート「'」、丸括弧「()」、アスタリスク「*」、正符号・加算記号「+」、コンマ「,」、セミコロン「;」、等号「=」が予約文字です。