WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perl5.8 の encoding 'sjis'

0:[投稿] B-Cus [2006/05/09 16:24 ] [環境:Firefox, IE6 Linux 2.6.12-1.1381_FC3, perl5.8.5]

perl5.8.5 にて、スクリプトを Shift_JIS で記述したいと思っていますが
うまくいきません。jperl の sjis モードのようなことができれば満足です。

以下のスクリプトを実行し、hoge.cgi?test=%82%A0%82%A2%82%A4%82%A6%82%A8
としてアクセスすると、Firefox 1.5.0.3 と IE6 いずれも
  あいうえお
  \x{0082}\x{00a0}\x{0082}¢\x{0082}\x{00a4}\x{0082}\x{00a6}\x{0082}¨
と表示されます。なぜ ※1 が化けず、※2 が化けるのでしょうか。

また、※2 が化けないようにするにはどうすればよいでしょうか。
 utf8::decode($value);
などをいろんな場所に放り込んでみましたが、結果は変わりませんでした。


------------------------------
#!/usr/local/bin/perl

use encoding 'sjis';
my %FORM = parse_form();

print "Content-type: text/plain; charset=Shift_JIS\n\n";
print "$FORM{'test'}\n";  # ※1 化けない
print $FORM{'test'};      # ※2 化ける
exit 0;

sub parse_form {
   my (%form);

   foreach my $form ( split(/&/, $ENV{'QUERY_STRING'}) ){
       my ($name, $value) = split(/=/, $form);
       $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
       $form{$name} = $value;
   }
   return %form;
}


1:[回答] B-Cus [2006/05/16 17:37 ]

もしかしてみなさまの環境では再現しないですか?


2:[回答] AC1号 [2006/05/16 20:57 ]

5.8.6ですが、再現しました。

Encode::is_utf8()を使ってUTF-8フラグがついているかどうか確認してみれば原因が分かりやすいと思います。$ENV{'QUERY_STRING'}や、それを加工して作った$FORM{'test'}はUTF-8フラグはついていません。しかし、"$FORM{'test'}"はencodingプラグマの作用によりUTF-8フラグがつきます。

※2が化けないようにするためには、URIデコードが終わった後でUTF-8フラグ付きの文字列にすればよいでしょう。
$form{$name} = Encode::decode('sjis',$value);


3:[回答] B-Cus [2006/05/22 10:42 ]

ありがとうございます。正しく表示されました。
よくわかってないのでいろいろ試してみます。


4:[完了] B-Cus [2006/05/22 10:42 ]

完了

回答(必須): 状態:

お名前(必須):

URL:




[戻る]