URLエンコード/パーセントエンコードとPHP : PHP

Pocket

URLで使用できない文字をバイト単位(8ビット、10進数256)で%XX(16進数)へエンコードします。  
パーセントエンコードとURLエンコードを区別せずともにURLエンコードと呼ばれることが多いようです。

種類 関数(カッコ内はデコード) 内容 対象 空白の扱い
パーセントエンコード rawurlencode(rawurldecode) 「RFC 3986 に基づき URL エンコードを行う」 出典PHP公式マニュアル URL(クエリ部分除く) %20
URLエンコード urlencode(urldecode) 多くの部分はパーセントエンコードと共通です。空白は+へ変換します。 POSTボディー部(enctype=”application/x-www-form-urlencoded” )
GETクエリ部
クッキー値
+

RFC 3986に準拠し空白を%20へ変換する符号化をパーセントエンコード、GETクエリ文字やPOSTボディー部(enctypeがapplication/x-www-form-urlencodedとき)およびクッキーなどで使われる空白文字を+へ変換する符号化をURLエンコーディングとよび区別することがあります。

rawurlencode

-_.~ を除くすべての非アルファベット文字をパーセント 記号 (%)に続いて 2 つの 16 進数がある表現形式に 置き換えた文字列を返します。これは、文字定数が特殊な URL デリミタと して解釈されたり、URL デリミタが(いくつかの電子メールシステムのような) 転送メディアにより文字変換されて失われてしまったりすることが ないように、» RFC 3986 で定められたエンコーディング方法です。

urlencode

-_. を除くすべての非英数文字が % 記号 (%)に続く二桁の数字で置き換えられ、 空白は + 記号(+)にエンコードされます。 同様の方法で、WWW のフォームからポストされたデータはエンコードされ、 application/x-www-form-urlencoded メディア型も同様です。歴史的な理由により、この関数は » RFC 3986 エンコード( rawurlencode() を参照してください) とは異なり、 空白を + 記号にエンコードします。

出典PHPマニュアル
参考 https://www.glamenv-septzen.net/view/1170

URLエンコードの例

文字 エンコード
%0D CR(キャリッジリターン)
%0A LF(ラインフィード)
%自体 %25

ブラウザのURLエンコードはOSに関わらず改行を%0D%0Aへ変換します。
PHPからセットされるCookieが改行を含む場合はUnix/Macなら%0A(LF)のみ、Windowsなら%0D%0A(CRLF)になります。

POSTボディー部(application/x-www-form-urlencoded)、GETクエリ部、CookieをブラウザはURLエンコードし送信します。PHPの$_POST, $_GET, $_COOKIEに格納されている値はデコードされた値です。

POST部のデコードされてないデータを取得したいときはphp://inputを使用できます。

php://input は読み込み専用のストリームで、 リクエストの body 部から生のデータを読み込むことができます。 POST リクエストの場合は $HTTP_RAW_POST_DATA よりも php://input を使うのが望ましいでしょう。

PHP: php:// – Manual

HTMLフォームとURLエンコード

HTMLフォームはenctypeへ指定した値がHTTP RequestのContent-Typeヘッダーへ設定されます。
ecntypeを省略したときはapplication/x-www-form-urlencodedになります。

<form action="form.php" method="POST" enctype="application/x-www-form-urlencoded">
    <input type="text" name="foo">
    <input type="submit" name="send" value="送信">
</form>

x-www-form-urlencodedのxは通常正式に規格化される前に付くプレフィックスですが互換性に配慮して正式に規格化されたあとも残っています。

HTTP Requestヘッダー
Content-Type Content-Type:application/x-www-form-urlencoded

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。