URI::Escape

Hippo2000 (2000/7/28)

URI::Escapeモジュールなのです。

作者はGisle Aasさんです。メールで許可をいただきました。


目次


名前

URI::Escape - 安全でない文字のエスケープとアンエスケープ


概要

 use URI::Escape;
 $safe = uri_escape("10% is enough\n");
 $verysafe = uri_escape("foo", "\0-\377");
 $str  = uri_unescape($safe);

説明

このモジュールはRFC 2396で定義されているURI文字列のエスケープとアンエスケープのための関数を提供します。URIはRFC2396でuricとして示された制限された文字のセットで構成されます。制限された文字のセットは数字、文字そしてほとんどの文字エンコーディングとインターネット・ユーザが利用できる入力機能に共通なものから選ばれたいくつかの記号で構成されます。

  "A" .. "Z", "a" .. "z", "0" .. "9",
  ";", "/", "?", ":", "@", "&", "=", "+", "$", ",",   # reserved
  "-", "_", ".", "!", "~", "*", "'", "(", ")"

さらに、すべてのバイト(オクテット)は、"%"とその後に続く2文字の16進数の3文字からなるエスケープ・シーケンスによってURIで表すことが出来ます。バイトはUS-ASCII文字を使って直接表すことも出来ます。(もしその文字がuricの一部であれば)

uric文字の幾つかは区切り文字として、あるURI構成要素の一部として使うように予約されています。通常のデータとして取り扱いたければ、これらはエスケープされなければなりません。さらなる詳細はRFC2396を読んでください。

このモジュールから提供される(そしてデフォルトでエクスポートされる)関数は以下の通りです:

uri_escape($string, [$unsafe])
この関数は$stringの安全でないすべての文字をエスケープ・シーケンスで置換し、その結果を返します。

uri_escape()関数は、オプションで文字のセットを上書きする2番目の引数を取ります。そのセットは正規表現文字クラス([]の間)で使うことが出来る文字列として指定されます。例:

  "\x00-\x1f\x7f-\xff"          # すべての制御および先頭ビットが立った(hi-bit)文字
  "a-z"                         # すべての小文字
  "^A-Za-z"                     # 文字以外のすべて

エスケープされるデフォルトの文字セットは上記で示したuric文字ではない部分のすべてです。

uri_unescape($string)
すべての%XXシーケンスを実際のバイト(オクテット)に変換した文字を返します。

これは以下のものと同じです:

   $string =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;

しかし、このREがするようにその場で(in-place)変更しません。REの代りにuri_unescape()関数を使うと、コードは見やすくなり、タイプする文字も少し減ります。

 
簡単なベンチマークテストを行ったところ、アンエスケープする文字が2、3であれば、(上記のインラインREの代りに)関数を呼び出すと40%ほど遅くなりました。何もなければ700%ほど遅くなりました。何回もアンエスケープするつもりであれば、インラインのREを使うのはよい考えでしょう。

モジュールはすべての256バイトからの対応するエスケープ・コードへのマッピングが入った%escapeハッシュもエクスポートします。毎回sprintf("%%%02X", ord($byte))を評価するよりも、このハッシュを検索するほうが速くなります。


参考資料

URI


著作権(COPYRIGHT)

Copyright 1995-1998 Gisle Aas.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


ホーム Perlの小技  URI

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。