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でやったら出来ました。 非常に助かりました。