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+???[??」と表示されてしまうので、気になっていたからです。実害は無いので放っておくことにしますが、なぜこうなるのか分かりません。
[上に]
[前に]
[次に]