URLエンコード
<form>から送られてくる文字列は、特殊文字が%ffのように%に続けて文字コードを16進表記した形の文字列にエスケープされた状態で送られてくる。
<form>から半角英数字以外が送られてくる可能性がある場合は、ほぼ復元処理を記述する必要がある。
復元するには
正規表現と
packを使う。
$form=~tr/+/ /;
$form=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2",$1)/eg;
$formに<form>から送られてきた文字列があるとして、
$form=~tr/+/ /;
これは、半角スペースは「+」に変換されて送られてくる可能性があるため、それを復元する。
$form=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2",$1)/eg;
正規表現により、%ffを変換する。
変換に
packを使うため、
正規表現には「e」オプションをつける。
packには16進を表す文字2文字であることを指定するため"H2"を渡す。
逆に、通常の文字列をURLエンコードする場合は、
$str=~s/(.)/'%'.unpack('H2',$1)/eg;
unpackして%を前につける。
$str=~s/(\W)/'%'.unpack('H2',$1)/eg;
半角英数字以外のみをURLエンコードするなら↑のような感じ。