プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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"); など

この回答への補足

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

補足日時:2005/03/10 14:14
    • good
    • 0

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ビットずつ取り出しています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/03/10 14:49

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



参考URL:http://techtips.belution.com/ja/perl/0000/

この回答への補足

ありがとうございます!
早速試してみたのですが、
文字コードを

sjisにした場合は ⇒ %82%a8%82%cd%82%e6%82%a4
eucにした場合は ⇒ %a4%aa%a4%cf%a4%e8%a4%a6

となるようなのですがescapeの場合と全く同じに
するには文字コードは何にすればよいのでしょうか?
また、その場合jcode.plとかでコンバートできますでしょうか?

補足日時:2005/03/08 18:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!