- ベストアンサー
URLエンコードをperlで
ieのjavascriptでescapeすると おはよう ⇒ %u304A%u306F%u3088%u3046 となりますが、これをperlなどで同じように エンコードする方法はありませんでしょうか?
- みんなの回答 (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"); など
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
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ビットずつ取り出しています。
お礼
分かりやすいサンプルありがとうございます! やっとどういうことか分かってきました。
- unimentai
- ベストアンサー率70% (34/48)
perlの場合は正規表現を用いて変換して下さい(下記参照)。
補足
ありがとうございます! 早速試してみたのですが、 文字コードを sjisにした場合は ⇒ %82%a8%82%cd%82%e6%82%a4 eucにした場合は ⇒ %a4%aa%a4%cf%a4%e8%a4%a6 となるようなのですがescapeの場合と全く同じに するには文字コードは何にすればよいのでしょうか? また、その場合jcode.plとかでコンバートできますでしょうか?
補足
詳細な解説ありがとうございます! 5.6だったのでJcodeでやったら出来ました。 非常に助かりました。