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

このQ&Aに関連する最新のQ&A

A 回答 (7件)

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



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

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

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

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

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


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

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

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


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

この回答への補足

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

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

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

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

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


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

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

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

この回答への補足

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

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

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

補足日時:2001/03/30 00:26
    • 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

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


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

この回答への補足

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

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

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

このQ&Aと関連する良く見られている質問

QCGIが文字化けしてしまう。(Perl)

環境 WinXP
   Apache
ActivePerl

開くソフトは「Tera pad」
    
でやっています。ソースは

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>CGI TEST</TITLE></HEAD>\n";
print "<BODY>ああああ。</BODY>\n";
print "</HTML>\n";
__END__

です。「ああああ」部分が「‚ ‚ ‚ ‚ B」
と表示されます。

どなたか解決方法ご存知の方いらっしゃいましたら
ご回答お願いします。

Aベストアンサー

CGIのヘッダで
print "Content-type:text/html; charset=shift_jis\n\n";
とすることも出来ますよ。
尚、.htmlの場合も.htaccessで指定することも出来ます
 

参考URL:http://hp.vector.co.jp/authors/VA014833/charset.html

QCGI(Perl)の文字化けについて

WEBフォームからの入力データをHTMLに加工して表示するというシンプルなCGIプログラムなのですが、
全角スペースの後に全角カタカナが入ると、全角スペースの部分から後が文字化けしてしまいます。
他はきちんと表示されているのですが、全角スペースとカタカナが続いているのが良くないみたいで、文字化けしてしまうようです。
全角スペースを取ってしまえばいいのかと思い、WEBで検索して色々と試してみましたが、変わりません。。
このような場合はどういう対処をするのが一番いいのでしょうか。
文字コードはEUCを使っています。(WEBフォーム、CGIとも)
教えてください。よろしくお願いいたします。

Aベストアンサー

失礼しました。
$val=~s/(?<!\xA1)\xA1\xA5/\x2E/g;
でいいと思いますが、J(j)code::tr を使う方が良いかもしれませんね。

QCGI/Perlという本はありますがCGI/PHPという本はないのはなぜですか?

アマゾンで調べると表題でCGI/Perlという本はありますがCGI/PHPという本はないのはなぜですか?

Aベストアンサー

なぜそのような書籍が無いのか結論から申し上げると「需要が無い」からです。
その理由はPHPとCGIの動作に起因し、PHP利用の最大のメリット(?なのでしょうか?)であるHTML組み込みなど利用できなくなるからです。

動作の概略(あくまで概略なので細かくするとキリがありません)を示しますと(右に長いのでテキストエディタなどにコピペしてみていただくと見やすいかと思います)

CGIの動作
 ブラウザ-[INTERNET]->Webサーバー -[CGI]-> システム:処理言語{Perl/C/Ruby...etc.}+プログラム:処理結果 -[CGI]-> Webサーバー -[INTERNET]->ブラウザ

PHPの動作
 ブラウザ-[INTERNET]->Webサーバー:PHP:処理結果 -[INTERNET]->ブラウザ

PHPを単体で処理できるようにインストール設定すればPHPをCGIとして利用することも可能です。当然、利用範囲がCGIの域を出なくなり、PHPとしてのメリットがなくなってしまいます。
そのような非効率的な運用利用をする方はほとんどいないので書籍にしても需要が無いと思います(何らかの事情で必要な方なら、WebサーバとCGIがしっかり理解できていれば簡単に実現できるかと思います)。

ちなみに、代表的なWebサーバApacheは外部組み込み機能を使ってPerlを「PHPの動作」と同じ動きをさせることができます。
そちらは「CGI」の範疇ではなく「Webサーバー構築」の分野ですのでそういった書籍を参考にしてください。

なぜそのような書籍が無いのか結論から申し上げると「需要が無い」からです。
その理由はPHPとCGIの動作に起因し、PHP利用の最大のメリット(?なのでしょうか?)であるHTML組み込みなど利用できなくなるからです。

動作の概略(あくまで概略なので細かくするとキリがありません)を示しますと(右に長いのでテキストエディタなどにコピペしてみていただくと見やすいかと思います)

CGIの動作
 ブラウザ-[INTERNET]->Webサーバー -[CGI]-> システム:処理言語{Perl/C/Ruby...etc.}...続きを読む

QPerlのCGIでフォームのテキスト配列をPerlで取得するには?

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが配列になった場合、
#<input type="text" name ="namae">
#<input type="text" name ="namae">
#<input type="text" name ="namae">
# のような場合、3件取得する場合

exit;

__END__

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが...続きを読む

Aベストアンサー

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
------------------------------------------------

例) CGI.pmを使う場合 --------------------------------
use CGI;

$query = new CGI; # 新しいCGIオブジェクトの作成
@hoge = $query->param('hoge'); # パラメータhogeの内容の受け取り
------------------------------------------------

参考URL:http://www.futomi.com/lecture/form/cgilib.html#3.2,http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm#FETCHING_THE_VAL

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
---------------------------------------...続きを読む

Qperl/cgiでjpeg画像のクリック座標をcgiパラメータに渡すには

perl/cgiで表示したjpegの画像のクリックした点の座標位置を次にジャンプするページにcgiパラメータとして渡したいのですがどのようにすれば良いでしょうか?画像全体を<input type="button" src="画像ファイル" name="$test" value="返答">のようにすればよいのかもしれませんが、座標をパラメータ渡しする方法がわかりません。perl/cgiだけでは無理であれば、javascriptでcgiに渡すためのヒントでも構わないのですが。。。
ご存知の方がいたらご教示ください。

Aベストアンサー

「画像ボタン」という手も。
<form ~>
<input type=image name="AAA" height=100 width=100 src="xxx.gif">
</form>

参考URL:http://tohoho.wakusei.ne.jp/html/input.htm


このカテゴリの人気Q&Aランキング

おすすめ情報