![]() |
カレッヂ |
質問者 初心者です
投稿日 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裏技 |