プロが教える店舗&オフィスのセキュリティ対策術

perlでCGIを作っています。入力フォームで文字を入力すると、text.dataでは文字化けしています。CGI上の文字は大丈夫なのですが・・。どのように対処すればいいでしょうか?
あと、if構文を試していたら、正解を書いても、パスワードを変えても対応せずに間違いだという画面しか出ません。必要があればプログラムも載せます。考えれることを教えてください。

A 回答 (7件)

漢字コードの変換はきちんと行っていますか?


CGIで入力されるデータの漢字コードは一定ではありませんから、CGIの最初のところでjcode.pl等を使って漢字コードをきちんと変換してやらないと、そりゃ文字化けして当たり前です。

この回答への補足

ありがとうございます。一応、jcode.plを使ってはいるのですが・・。danyさんの補足に詳しく書きましたのでよろしければ、教えてください。ちなみにjcode.plは自分で書いていないので(あるのを拝借した)こっちに問題がある場合は特に詳しく教えてください。分かりにくい質問ですみません(^^;

補足日時:2001/03/28 20:34
    • good
    • 0

あー、質問がよくわからないのですが、


「text.dataでは文字化けします。CGI上の文字は大丈夫なのですが」
というのは、
「ブラウザに表示されたフォームに文字を入力している時点では
 化けていないのに、フォームデコードしたものになにがしかの処理を
 加えると化けてしまう」
という意味でしょうか? cockyさんが書いているように、入力画面、
スクリプト内で文字コードを統一しないといけません。

また、shift-jisで書かれたスクリプトの中で「横浜」とか書くと
化けます。一番簡単なのはすべてEUCで統一することですかね。

ifに関しては、これだけの情報ではサッパリです。^^;

この回答への補足

ありがとうございました。下記に補足します。
このように書いたのですが、かなが文字化けしており、
英数は文字化けしません。一応、文字コードは指定してあるはずですが、これではいけませんか?

require 'cgi-lib.pl';
&ReadParse(*answer);
$data="$answer{'text1'},$answer{'select'},$answer{'text2'}";

require 'jcode.pl';
&jcode'convert(*data,'euc');$jikan = localtime(time());


open (ANSWER, ">>data.text");
print ANSWER "$jikan,$data\n";
close (ANSWER);

また、if構文ですが、長くなりますが、やはり全部載せます(^^;。すみませんが、また教えてください。

#!/usr/local/bin/perl

require 'cgi-lib.pl';
&ReadParse(*answer);
$data = $answer{'text1'};

require 'jcode.pl';
&jcode'convert(*data,'euc');

print "Content-type:text/html\n\n";


if ($data eq "ゆず") {

print <<EOF;

<html>
<head><title>当たり!</title></head>

<body>

<font size="4">
正解です。
</font>
<a href="index.html">ここ</a>をクリックしてください。
</font>
<br><br>

EOF

} else {

print <<EOF;

<html>
<head><title>はずれ!</title></head>

<body>

<font size="4">
はずれです。
<a href="JavaScript:history.back()">もう一度入力してください。</a>
</font>
<br><br>

EOF


}
print <<EOF;

</body>
</html>

EOF

exit;

補足日時:2001/03/28 20:20
    • good
    • 0

スクリプト自体の漢字コードは何で書かれてますか?


あと、出力結果のファイルの内容は何で確認しましたか?

スクリプトがShiftJISで書かれているのに漢字コードをEUCに変換したら、同じ文字でもコード体系が異なるためにif文でデータが一致しないのは当然だと思います。
またEUCで出力されたファイルをダウンロードしてメモ帳などで開いても、Windowsのメモ帳はShiftJISコードのテキストでないと文字化けしますから、それは文字化けするように見えてしまいますよね。

大事なのはdanyさんも書かれているように「文字コードを一つに統一する」ことなので、その点に注意してやり直してみて下さい。
プログラムそのものは文法的におかしいところはなさそうなので。

この回答への補足

迅速なお返事ありがとうございます。

すごく恥ずかしいのですが、漢字コードを何で書いてあるかという質問について、よくわからないのですが、とりあえず、秀丸で書いてて、文字コードを自動判別するようにしてあり、そのままプログラムを書いています。のでEUCになっているものだと思っているのですが・・?

また、出力結果のファイルの内容はやはり、秀丸で開いています。

補足日時:2001/03/30 00:26
    • good
    • 0

cockyさんと同様、スクリプトがsjisで書かれているような気がします。


エディタは何を使ってますか?
eucの「ゆず」とsjisの「ゆず」はコードが違うからif は真に
なりません。

この回答への補足

お返事ありがとうございます。
エディタは秀丸を使っています。
cockyさんの補足にも書いたのですが、秀丸で自動判別にしてあるので、EUCで書かれているのだと思っていたのですが・・?

初心者すぎる質問で恥ずかしいのですが、スクリプトを確認するにはどうすればいいですか?

やっと、お二人の言いたいことが分かり始めたました(^^;たびたびすみませんがよろしくお願いします。

補足日時:2001/03/30 00:35
    • good
    • 0

Windows上で扱う基本的な文字コードはshift-jis(sjis)です。


だから新規でテキストを作った場合などは何もしなければ
sjisで保存されます。

セーブする時文字コードの指定とかできるんじゃないですか?

「自動判別」というのは読み込むファイルの文字コードを判別
する機能です。秀丸は使っていないので詳しいことは不明ですが、
offの状態でeucやjisのファイルを読ませると化けたりするのでは。

私が使っているWZ Editorでは[ファイル]-[文書の情報]で文字
コードを確認することができます。秀丸にも似たような機能が
あるのではないかと。

IEにテキストを読ませて、[表示]-[エンコード]で調べてみるのも
いいかも。違うコードなら化けます。
    • good
    • 0
この回答へのお礼

本当に何度もありがとうございました。
一度、cockyさんに言われたとおり、textファイルを抹消したところ、無事文字化けせずにみれました。
やはり、sjisで書かれていたようでした。if構文のほうはif2に名前を変えてEUCで保存しなおしたところうまく作動しました。まだまだわからないことが多いですが、今回は本当に何度も教えてもらい感謝しています。ありがとうございました。またよろしくお願いします(笑)

お礼日時:2001/03/31 16:59

スクリプトのencodingについてはdanyさんの書かれている通りです。


秀丸は使ってないので(私はDana派)詳細はわかりませんが、秀丸に限らず一般的なWindowsのエディタであれば標準の漢字コードはShiftJISになるので、EUCで処理したければnkfなどの漢字コード変換ツールを使う必要があります。
あるいは秀丸に漢字コードの変換機能があればそれを使うのも手でしょう。

ところで、出力されたdata.textを秀丸で開いた場合はどうなのでしょうか?
自動判別がonになっているのであれば、文字化けはしないと思うんですが…。
    • good
    • 0

秀丸の自動判別について補足です。



秀丸に限らず、基本的にエディタの「自動判別」はファイルの先頭部のデータの漢字コードを見て判別を行っているので、ファイルの先頭部にShiftJISのデータが入っていて、その後にEUCのデータが続くようなケースでは、エディタは漢字コードをShiftJISとして判断してしまうので、EUCの部分は文字化けして表示されます。

一度data.textのファイルを抹消してみて、ファイルサイズ0の状態でCGIを実行させるとどうなりますか?
    • good
    • 0
この回答へのお礼

ありがとうございました。一度data.textのファイルを抹消したところ、無事文字化けせずにできました。また、if構文はif2に名前を変更して、もう一度EUCで保存しなおしたところ、きちんと作動しました。
何度も教えてもらい本当にお世話になりました。ありがとうございました。またよろしくお願いします(笑)

お礼日時:2001/03/31 16:53

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