s/([^;\/?:@&=+\$,A-Za-z0-9\-_.!~*'()])/$escapes{$1}/g;となっています。hexとなっています。コードを見たのですが、実際にはescapedをさらにエスケープするようです。これはこれで実用上は構わないのでしょう。2732では、`['と`]'をreservedに移しています。s/([^;\/?:@&=+\$,A-Za-z0-9\-_.!~*'()\[\]])/$escapes{$1}/g;になります。endendとなるでしょうか。正規表現の[^]を展開すると私の理解を越えてしまうので、そのままにしておきました。ひさんのおっしゃることにも一理あって、何をエスケープするかは、ライブラリの実装者が決めかねるところでもあります。[$unsafe])として、どの文字をエスケープの対象にするか、ユーザが決められるようになっています。')としたほうがいいかも知れません。'を`+'に変換する処理は、もともとURIの範疇ではありませんし、削ることに異論はありません。考えてみれば、エスケープする機能は、正しいURI文字列を作るためには必要ですね。fa2.so-net.ne.jp。