PerlでのURLエンコーディング
URLエンコーディング
URLエンコーディング(ユー・アール・エル・エンコーディング)、URLエンコード、パーセントエンコーディング
エンコーディング(エンコード)とは、データを特定のコードに変換することです。また、元に戻すことをデコーディング(デコード)と言います。
URLエンコーディングとは、URLに英字、数字、特定の記号(ピリオド、ハイフン、アンダースコア、チルダ)以外を指定する場合に、そのコードが特別な意味をもってしまうことを避けるために、16進数表現でエンコードする方式です。日本語の全角文字もエンコードの対象です。
エンコードの書式は「%nn」で、nnは16進数表現です。それで1バイトを表現します。たとえば「http://」は「http%3A%2F%2F」になります。
クエリー文字列内におけるスペース(半角空白)のエンコードは例外で、「+」に置き換えて表現します。
エンコードの16進数のアルファベットは大文字でも小文字でも構いません。
「URLエンコーディング」は、最新の規格(RFC3986)において「パーセントエンコーディング」と呼ばれます。
http://www.seiren-udoku.com/noteOfSeoMR-URL%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0.html
最新の規格(RFC3986 日本語訳)
http://www.studyinghttp.net/
に行って、以下のURLを入力
http://www.studyinghttp.net/cgi-bin/rfc.cgi?3986
上記を踏まえてコーディングすると・・・
URLエンコード
$string =~ s/([^\w .-~])/'%'.unpack('H2', $1)/eg; $string =~ tr/ /+/;
URLデコード
$string =~ tr/+/ /; $string =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2', $1)/eg;
尚、フォームのエンコード方法は、以下の通りです。
フォームのエンコード方法はその中のRFC1866の第8.2.1節にあります。
http://www.kinet.or.jp/hiromin/cgi_introduction/appendix/url_encode.html
スペースは '+' に置換する。
RFC1738(後述)で予約文字として定義されている文字はその16進数を%XX形式に変換する。
属性名と属性値はイコール"="で区切る。
レコード(属性名と属性値の2つ組み)はアンド"&"で区切る。