Perl5でURLエンコードするには?

[上に] [前に] [次に]
CZ 1999/12/09(木) 01:56:29
Perlでフォームデータをデコードする方法は分かりますが、その逆が分かりません。

$value =~ s/([\W])/sprintf("%%%02X", unpack("C", $1))/eg;
$value =~ tr/ /+/;
というのを試してみましたが、+がそのまま出ないなどの問題が出てうまく行きません。さらに日本語が化けるのでjcodeで何とかしたいのですがどうすればいいのか分かりません。

やり方をご教示ください。よろしくお願いします。

1999/12/09(木) 02:01:43
$value =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
ですかね。

ふじ 1999/12/09(木) 02:18:43
私なぞがあれこれ書くよりも、大崎氏の
http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape
をご覧になった方が詳しいですね(^^;

>+がそのまま出ないなど
URLにデータを含める場合、 + はデータの区切りになることがあります。
なので、+ 自身をデータとしたい場合はエンコードしなくてはいけません。

jcode.pl については、
「jcode.pl の私的な解説書」
http://ina.kappe.co.jp/~sabre/kcode/jcode.html

CZ 1999/12/09(木) 11:55:57
[[解決]]
ふじさん、またまたありがとうございました。

http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape で紹介されていたこの方法でうまく行きました。

$value =~ s/([^\w ])/sprintf("%%%02X", ord($1))/eg;
$value =~ tr/ /+/;

このような処理は正確にはURLエスケープというのですね。初めて知りました。

>日本語が化けるのでjcodeで何とかしたい
と思ったのは、
(1)URLアンエスケープ時の作業は以下のように行なっていますが、
$value =~ tr/+/ /;
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/chr(hex($1))/eg;
&Jcode::convert(\$value, $kcode);
URLエスケープはこの逆だから、やはりコンバート作業が必要かと考えたため、
(2)<A href="**.cgi?s=%83e%83X%83g+%83%81%81%5B%83%8B">
こんな風にリンクを貼ると、IE5のステータスバーに「**.cgi?s=?e?X?g+???[??」と表示されてしまうので、気になっていたからです。実害は無いので放っておくことにしますが、なぜこうなるのか分かりません。

[上に] [前に] [次に]