- ベストアンサー
index関数で日本語を使用する場合の問題(追加質問)
- 【質問内容】前回は use encoding "shiftjis"; を使用して文字化けを解決しましたが、cgiにすると文字化けします。&ReadParseを使用し、かつ、文字化けしない方法があれば教えてください。
- 質問者は、前回の質問で日本語を使用する場合の問題を解決するために、use encoding "shiftjis"; を使用しましたが、この方法ではcgiにすると文字化けしてしまいます。そのため、&ReadParseを使用して文字化けしない方法を知りたいという追加の質問をしています。
- 質問者は、日本語を使用する場合の問題を解決するために、use encoding "shiftjis"; を使用しましたが、cgiにすると文字化けしてしまうため、&ReadParseを使用して文字化けしない方法を知りたいという追加の質問をしています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> テキストボックスに'東'を入れて検索すると、$resultには0が返ってくるはずですが、-1が返ってきます。 use encoding 以降は、文字列(例えば「東秀」など)は内部で Unicode として扱われますが、%in の要素はそれ以前に ReadParse したデータ(恐らくsjis)であるため、文字コードが一致せず、index が -1 を返すのだと思います。 なので、ReadParse したデータも Unicode にしてやればよいので、BEGIN ブロックの後に use Encode; foreach my $key (keys %in) { $in{$key} = decode('sjis', $in{$key}); } を入れてみてください。 ※use encoding とは、どちらが先でもいいと思います。 また、ここでは decode の引数を 'sjis' と固定していますが、本来は %in 内の文字コードを調べ、'sjis' なり 'euc-jp' なりを渡す必要があります。 たいていは sjis で来ると思いますが、全ての環境(OS/Browser)で必ずそうとは言い切れませんので。
その他の回答 (2)
- leaz024
- ベストアンサー率75% (398/526)
encoding プラグマについては、趣味で情報集めしている程度なのであまり詳しくないのですが・・・ これは単に、encoding と ReadParse の相性の問題ではないかと思います。 だとすれば、use encoding する前に ReadParse を実行できればよいので、 require 'cgi-lib.pl'; &ReadParse(*in); の2行を BEGIN ブロックに入れ、BEGIN ブロックより下で use encoding 'sjis' してみてください。 ソースはシフトJISのままで問題ないはずです。
補足
ありがとうございます。 エラーも無くなりましたが、 以下のようにPOSTで自分宛てに渡したデータが検索に引っかかってくれません。 以下例でテキストボックスに'東'を入れて検索すると、$resultには0が返ってくるはず ですが、-1が返ってきます。 use encoding "shiftjis"を外せば、期待どおり0が返ってくるのですが。 なんどもすみませんが、よろしくお願いします。 ================================================================ #!/usr/bin/perl BEGIN { require 'cgi-lib.pl'; &ReadParse(*in); use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } use encoding "shiftjis"; $data = '東秀'; $key = $in{'key'}; $result = index($data,$key); print "Content-type: text/html\n\n"; print <<EOF; <html> <meta http-equiv="Content-Type" content="text/html;charset=Shift-JIS"> <form action="test.cgi" method="post"> <input type="text" name="key"> <input type="submit" value="検索"> </form> data = $data<br> key = $key<br> result = $result<br> </html> EOF ================================================================
- Dpop
- ベストアンサー率51% (279/544)
文字コードをEUCにしてみましょう。 CGIの文字コードをEUCにしてみてください。(METAも)それで解決すると思います。
補足
ありがとうございます。 Shift-JISをShift-JISにエンコードしようとするから文字化けする、 ということですね。 cgiのソースコードをEUCで保存し、METAもEUJ-JPにして試しましたが、 残念ながら、 (1),12行目の 「 $key = '件';」 でエラーが出ます。 Unrecognized character \xB7 at d:\HTTPRoot\test\test.cgi line 12. (2),11~13行目をコメントアウトすると、エラーは無くなりますが、文字化けします。 (3),ブラウザ(IE)の表示→エンコードでShift-JISやUnicodeに切り替えても、文字化けします。 ======================================================= #!/usr/bin/perl require 'cgi-lib.pl'; &ReadParse(*in); use encoding "shiftjis"; BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } $data = '東秀'; $key = '件'; $result = index($data,$key); print "Content-type: text/html\n\n"; print <<EOF; <html> <meta http-equiv="Content-Type" content="text/html;charset=EUC-JP"> テストです。<br> result = $result<br> </html> EOF ======================================================= 環境 ・Windows2000 ・AnHTTPd ・Active Perl 5.8.3
お礼
検索できるようになりました。 私も、最初は文字コードが違うのだろうなとは思ったのですが、 ブラウザに表示すると'東秀'もReadParseした'東'もどちらも化けずに 表示されるので、ちょっと混乱してました。 '東秀'のほうだけ内部的にUnicodeになっており、表示するときには どちらもShift-JISになっていたのですね。 ありがとうございました。