小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

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節にあります。
スペースは '+' に置換する。
RFC1738(後述)で予約文字として定義されている文字はその16進数を%XX形式に変換する。
属性名と属性値はイコール"="で区切る。
レコード(属性名と属性値の2つ組み)はアンド"&"で区切る。

http://www.kinet.or.jp/hiromin/cgi_introduction/appendix/url_encode.html