TOP 投稿 過去ログ 管理用 RSS RDF

PerlでURIエンコード・デコードする。

「URIエンコード」とは、URIで使用禁止となっている文字を埋め込むためのルールである。
RFC上ではPercent-Encodingと呼ばれ、ASCII以外の文字を「%xx」(xxは16進数)という形でURIに表記することになっている。
使用される文字コードに制限はないが、16進数のコードは文字コードによって異なるため、デコードされた文字を扱う際はページに合わせて文字コードを変換する必要がある。

PerlでURIエンコードする場合、正規表現で1文字分を選択して、unpackで16進数の表記に変換、そして半角スペースを+に変換します。
URIデコードはその逆で、+をスペースに変換し、正規表現で %xx の xx をpackで文字データに戻します。
関数にしておけば簡単です。

URIエンコード
sub url_encode($) {
my $str = shift;
$str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$str =~ tr/ /+/;
return $str;
}

URIデコード
sub url_decode($) {
my $str = shift;
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
return $str;
}


RubyならURIモジュールにエンコード・デコード用の関数があるので一発です。
・URIエンコード ⇒
URI.escape($str) or URI.encode($str)

・URIデコード ⇒
URI.unescape($str) or URI.decode($str)


PerlもURI::Escapeモジュールを使えばURIエンコード・デコードが可能です。
use URI::Escape;
uri_escape($str);
uri_unescape($str);


Perl で url エンコードと url デコード
URIエンコード - Wikipedia
URI::Escape - search.cpan.org
URLを触る時は、URI(モジュール名)以外も知っておくと吉