• ベストアンサー

"ー"を含むとサーバーエラーになる

HTMLのShift_JISに合わせて、Jcode.plで日本語コード変換のeucをsjisに変更したのですが、"ー"が$FORM{'key'}に含むとサーバーエラーになります。 どうしたら、sjisで"ー"など一部文字でエラーなく処理できるのでしょうか? アドバイスお願い致します。 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $name2 = $name; $value2 = $value; $FORM2{$name} = $value; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); #←ここを変更

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

  • ベストアンサー
  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.1

"ー"はSJISでメタ文字"["を含むためのエラーのようです。 foreach中はむしろeucやutf8のような、問題を起こさない文字コードに変換して処理をさせ、printする直前でsjis等に戻してやるのが良いと思いますが、 それ以前にコードの書き方そのものが旧世紀の負の遺産らしいです。 以下のコードにするだけで片付くかもしれません。 #!/usr/bin/perl -T use strict; use warnings; use CGI; my $q = CGI->new(); my $name = $q->param('name'); my $value = $q->param('value'); print "$name\n"; print "$value\n"; 詳しくは参考URLをご覧下さい。

参考URL:
http://blog.livedoor.jp/dankogai/archives/50780781.html
umistu
質問者

お礼

ご回答ありがとう御座います。 色々と考えてみましたが、結局はEUC-JPのままで合わせることにしました。

その他の回答 (1)

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.2

No.1さんがおっしゃるように、EUC-JPかUTF-8で処理するのが一番スマートかと思い ます。 おそらく正規表現のところでエラーが出ているのだと思います。 まず、どこでエラーが出ているのかを以下の文を追加して特定してください。 use CGI::Carp qw(fatalsToBrowser); そして、エラーの出ている正規表現で、quotemataをするか、/\Q~\E/でメタ文字を 無効化してみてください。

umistu
質問者

お礼

ご回答ありがとう御座います。 quotemataはエラーはメタ文字無効化はでませんが、別の課題もありますので、EUC-JPに戻して処理することにしました。

関連するQ&A