CGI-BBS > CGI > Perl > CSVデータが文字化けする。


カレッヂ
カレッヂ


質問者 初心者です  投稿日 2006/1/30(月) 16:05:21
教えて下さい。
アンケートの結果をCSVファイルにするCGIを作成中です。

CSVファイルの日本語部分がどうしても文字化けしてしまいます。

サーバーはUNIXで、HTMLには、
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ECU">
とCGIはECUで記述しています。

いろいろと試してみたのですが、どうしてもうまく動作しません。


下記にプログラムをコピーしました。
よろしくお願いします。


#フォームからデータを受け取り変数へ入れる
read(STDIN, $FORMDATA, $ENV{'CONTENT_LENGTH'});

# + 記号を半角スペースに戻す
$FORMDATA =~ tr/+/ /;

#time関数で得られた数値をlocaltime関数で整形し各変数に入れる
($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time);

#曜日は 0〜6 の値が返されるので配列で扱う
@wdays = ('SUN','MON','TUE','WED','THU','FRI','SAT');

#返された値をさらに sprintf関数で整形し、書式を読みやすいようにする。
$nitizi = sprintf("%04d/%02d/%02d(%s) %02d:%02d",$year+1900,$mon+1,$mday,$wdays[$wno],$hour,$min);

#URLエンコードデータをデコード
$FORMDATA =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

@indata = split (/&/,$FORMDATA); #受け取ったデータを&で区切り、配列へ

foreach $tmp (@indata) #フォームの要素分(配列分)以下の処理を繰り返す
{
	($name,$value) = split (/=/,$tmp); # =記号で区切り、名前 と 値 に分ける
	$FORMDATAh{$name} = $value; #区切った名前を付けた連想配列に値を入れる
}

#既存ファイルを読み込み、配列@aaa に入れる
open (IN,"data/data.csv");
@aaa = <IN>;
close (IN);

#フォームから受け取ったデータを配列に追加する
#その際に各要素はコンマで区切り、後で使えるようにする
push (@aaa,"$FORMDATA{'kaisaibi'},$FORMDATA{'tekinen'},$FORMDATA{'zip1'}-$FORMDATA{'zip2'},$FORMDATA{'todoufuken'}$FORMDATA{'address'},$FORMDATA{'tel1'}-$FORMDATA{'tel2'}-$FORMDATA{'tel3'},$FORMDATA{'mail'},$FORMDATA{'shimei1'},$FORMDATA{'syozoku1'},$FORMDATA{'shimei2'},$FORMDATA{'syozoku2'},$FORMDATA{'shimei3'},$FORMDATA{'syozoku3'},$nitizi\n");

#新しいデータが追記された配列を data.csv に書き出す
open (OUT,">data/data.csv");
print(&jcode::euc2sjis("@aaa")); 
print OUT @aaa;
close (OUT);

【習熟度】初めて

回答者 かなやん  [削除]  投稿日 2006/3/2(木) 00:50:38
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ECU">
↑
ではなく
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=x-euc-jp">
でどうですか??
あと・・ECU→EUCではないでしょうか??

------------------------------------------
open (IN,"data/data.csv");
@aaa = <IN>;
close (IN);
#フォームから受け取ったデータを配列に追加する
#その際に各要素はコンマで区切り、後で使えるようにする
push (@aaa,"$FORMDATA{'kaisaibi'},$FORMDATA{'tekinen'},$FORMDATA{'zip1'}-$FORMDATA{'zip2'},$FORMDATA{'todoufuken'}$FORMDATA{'address'},$FORMDATA{'tel1'}-$FORMDATA{'tel2'}-$FORMDATA{'tel3'},$FORMDATA{'mail'},$FORMDATA{'shimei1'},$FORMDATA{'syozoku1'},$FORMDATA{'shimei2'},$FORMDATA{'syozoku2'},$FORMDATA{'shimei3'},$FORMDATA{'syozoku3'},$nitizi\n");
#新しいデータが追記された配列を data.csv に書き出す
open (OUT,">data/data.csv");
print(&jcode::euc2sjis("@aaa")); 
print OUT @aaa;
close (OUT);
-----------------------------------------------------
↑ではリストをeucにしようとしているので上手く行かない可能性があります。
そこで・・・
-----------------------------------------------------
open (IN,"data/data.csv");
@aaa = <IN>;
close (IN);
#フォームから受け取ったデータを配列に追加する
#その際に各要素はコンマで区切り、後で使えるようにする
#変数に一旦入れてSJISにする。
$tsuika = "$FORMDATA{'kaisaibi'},$FORMDATA{'tekinen'},$FORMDATA{'zip1'}-$FORMDATA{'zip2'},$FORMDATA{'todoufuken'}$FORMDATA{'address'},$FORMDATA{'tel1'}-$FORMDATA{'tel2'}-$FORMDATA{'tel3'},$FORMDATA{'mail'},$FORMDATA{'shimei1'},$FORMDATA{'syozoku1'},$FORMDATA{'shimei2'},$FORMDATA{'syozoku2'},$FORMDATA{'shimei3'},$FORMDATA{'syozoku3'},$nitizi\n";
&jcode::euc2sjis(\$tsuika);
push(@aaa,$tsuika);
#新しいデータが追記された配列を data.csv に書き出す
open (OUT,">data/data.csv"); 
print OUT @aaa;
close (OUT);
-----------------------------------------------------
とすれば上手くいくと思います。
一旦お試しになってください。
質問者 初心者  [削除]  投稿日 2006/3/24(金) 14:12:13
遅くなりました。
ありがとうございました。
出来ました。
すごく助かりました。

このページは終了したので返信(回答)は書きこめません
 


Web裏技