![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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
===================================================
よろしくお願いします。
No.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)で必ずそうとは言い切れませんので。
検索できるようになりました。
私も、最初は文字コードが違うのだろうなとは思ったのですが、
ブラウザに表示すると'東秀'もReadParseした'東'もどちらも化けずに
表示されるので、ちょっと混乱してました。
'東秀'のほうだけ内部的にUnicodeになっており、表示するときには
どちらもShift-JISになっていたのですね。
ありがとうございました。
No.2
- 回答日時:
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
================================================================
No.1
- 回答日時:
文字コードを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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
標準入力からのutf-8→euc-jpで...
-
このような文字列
-
1つのサイトで文字コードが混在...
-
Perl 文字化け
-
CSVファイルの中で、「 , 」カ...
-
何故、日本は未だに数字を3桁...
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
プログラミングでは、半角括弧...
-
何故、日本は未だに数字を3桁...
-
正しいメールアドレスの形式で...
-
スマホの予測変換について
-
C#でcsvファイルの列を入れ替え...
-
全角英数字の必要性が理解できない
-
カンマ区切りの数字をCSVフ...
-
PHPの文字化けについて
-
Excel VBAでオートシェイプ内の...
-
文字コードの%E3%80%とは何です...
-
EXCELからCSVにすると余計なカ...
-
perl初心者です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonエラー
-
Perl:ファイル名だけ文字化けする
-
MIMEでエンコードされたMailのS...
-
1つのサイトで文字コードが混在...
-
「繝・せ繝・」となる文字化け
-
IMAP4でsubjectが検索ヒットしない
-
quoted-printableのアルゴリズム
-
メール(iso-2022-jp-2)のデコ...
-
Perl 文字化け
-
URLエンコードされたデータを戻...
-
perlの日本語文字コードはどう...
-
CASLIIの数値データ入出力
-
BASP21によるbase64のデコード...
-
文字コードの変換
-
標準入力からのutf-8→euc-jpで...
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
データにカンマが入ったCSVデー...
-
EXCELからCSVにすると余計なカ...
-
Excel VBAでPDFファイルをMicro...
おすすめ情報