dポイントプレゼントキャンペーン実施中!

7つ下で「index関数で日本語を使用する場合の問題」の質問をしましたが、
追加で質問させてください。

前回は use encoding "shiftjis"; を使用することで解決しました。
DOS窓のコマンドラインではこれで良かったのですが、
これをcgiにしてブラウザから表示させると文字化けします。

3行目の&ReadParseを外せば文字化けしないのですが、
&ReadParseを使用し、かつ、文字化けしない方法がありましたら
ご教授いただけませんでしょうか。


===================================================
#!/usr/bin/perl
require 'cgi-lib.pl';
&ReadParse(*in);
use encoding "shiftjis";

$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=Shift_JIS">
テストです。<br>
result = $result<br>
</html>
EOF
===================================================

よろしくお願いします。

A 回答 (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)で必ずそうとは言い切れませんので。
    • good
    • 0
この回答へのお礼

検索できるようになりました。

私も、最初は文字コードが違うのだろうなとは思ったのですが、
ブラウザに表示すると'東秀'もReadParseした'東'もどちらも化けずに
表示されるので、ちょっと混乱してました。
'東秀'のほうだけ内部的にUnicodeになっており、表示するときには
どちらもShift-JISになっていたのですね。

ありがとうございました。

お礼日時:2004/05/28 19:22

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
================================================================

補足日時:2004/05/28 16:58
    • good
    • 0

文字コードを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

補足日時:2004/05/28 11:53
    • good
    • 0

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