• ベストアンサー

URLエンコードをperlで

ieのjavascriptでescapeすると おはよう ⇒ %u304A%u306F%u3088%u3046 となりますが、これをperlなどで同じように エンコードする方法はありませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

IEなどのJavaScriptで escape を使うと、日本語などは UTF-16(Big Endian)にエンコードされ、%uHHHH 形式にエスケープされます。 また US-ASCII の場合、A-Z a-z 0-9 _ @ . * / + - はエスケープされず、それ以外は %HH 形式にエスケープされます。 UTF-16 への変換は jcode.pl ではできないので、何かしらのモジュールが必要です。 Perl 5.8 以上ならば Encode.pm が標準で使えますが、そうでない場合は Jcode.pm をインストールして使うとよいでしょう。 ※ただし、Jcode.pm には utf16 関数がないので、ほぼ同等の ucs2 関数を使います。 以下、サンプルです。 # Encode ver. sub js_escape {   use Encode;   my $str = join "", map sprintf("%%u%04X", $_), unpack "n*", encode("utf16be", decode($_[1], $_[0]));   my ($ch, $hex);   $str =~ s<%u00(..)>{ ($ch = pack("H2", $hex = $1)) =~ m<[^\w\@.*/+-]> ? "%$hex" : $ch }eg;   $str; } # Jcode ver. sub js_escape {   use Jcode;   my $str = join "", map sprintf("%%u%04X", $_), unpack "n*", Jcode->new(@_)->ucs2;   my ($ch, $hex);   $str =~ s<%u00(..)>{ ($ch = pack("H2", $hex = $1)) =~ m<[^\w\@.*/+-]> ? "%$hex" : $ch }eg;   $str; } どちらも使い方は同じで、   $escaped_str = js_escape($str, $icode); となります。 $icode には $str のエンコーディング("sjis" や "euc-jp" など)を指定して下さい。 # print js_escape("おはよう", "sjis"); など

una10
質問者

補足

詳細な解説ありがとうございます! 5.6だったのでJcodeでやったら出来ました。 非常に助かりました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

Perl 5.8.4を使ったサンプル #javascript互換escape use Encode qw(from_to); $test="おはよう"; $len=from_to($test,'SHIFTJIS','UTF16BE'); #$len=length($test); for($i=0;$i<$len/2;$i++){ $code=vec($test,$i,16); printf "%%u%04X",$code; } 解説: 要は質問文のコードは、ユニコードに%uを付けたものだってことです。 そこで、現在の文字コードのシフトJISからユニコードに変換して、vecで16ビットずつ取り出しています。

una10
質問者

お礼

分かりやすいサンプルありがとうございます! やっとどういうことか分かってきました。

  • unimentai
  • ベストアンサー率70% (34/48)
回答No.1

perlの場合は正規表現を用いて変換して下さい(下記参照)。

参考URL:
http://techtips.belution.com/ja/perl/0000/
una10
質問者

補足

ありがとうございます! 早速試してみたのですが、 文字コードを sjisにした場合は ⇒ %82%a8%82%cd%82%e6%82%a4 eucにした場合は ⇒ %a4%aa%a4%cf%a4%e8%a4%a6 となるようなのですがescapeの場合と全く同じに するには文字コードは何にすればよいのでしょうか? また、その場合jcode.plとかでコンバートできますでしょうか?

関連するQ&A