dポイントプレゼントキャンペーン実施中!

フォームに文章を入力し内容を送信するCGIを組んだのですが、送信内容の確認画面において文字化けが生じました。
よく聞く「表示」などの文字化けとは違う文字で、「欲求不満」「早苗」などで発生しています。
ただ、「欲求」「不満」「早」「苗」では文字化けせず、「求不」「早苗」という単語になって初めて文字化けするようです。
送信内容はsjisに変換して処理しています。

これはどういったことが原因で発生するのでしょうか?
原因と解決法を御教示いただけたらと思います。

A 回答 (3件)

>このCGIに送った場合はしっかりと「欲求不満」と表示されました。


と言う事でしたら、CGIプログラムに問題がありそうですね。
フォームから受け取った文字列を処理している部分をチェックしていくしかないでしょう。
どこかで内容を書き換えてしまっていると思います。
    • good
    • 0
この回答へのお礼

1つ1つプロセスを検証した結果、原因が分かりました。
途中の禁止ワード処理で誤って書き換えが生じてしまっていたようです。
アドバイスありがとうございました!

お礼日時:2006/11/29 21:03

GCIを作ってみて検証しましたが、私の環境では文字化けは再現できませんでした。


下記のCGIは受け取ったデータを表示するだけのCGIです。
もしお時間が有れば、フォームの送信先をこのCGIに置き換えてみて下さい。
このCGIでは正しく表示されますか?

#!/usr/local/bin/perl
print "Content-Type: text/html\n";
print "\n";
print "<html><head>\n";
print "<meta http-equiv='Content-Type' content='text/html; charset=SHIFT_JIS'>\n";
print "</head><body>\n";
%argv = &read_argv();
print "</body></html>\n";
exit;

sub read_argv(){
my($buf,@pair,%argv,$key,$value);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} else {
$buf = $ENV{'QUERY_STRING'};
}
#POST or GET された生データ
print "生データ<br>$buf<br>";
@pair = split(/&/, $buf);
print "デコード後<br>";
foreach (@pair) {
($key,$value) = split(/=/,$_);
$argv{&url_decode($key)} = &url_decode($value);
#デコード後のデータ
print &url_decode($key)." = ".&url_decode($value)."<br>";
}
return %argv;
}

sub url_decode(){
my($data) = shift;
$data =~ s/\+/ /g;
$data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2",$1)/eg;
return $data;
}

この回答への補足

お手数をおかけします。
このCGIに送った場合はしっかりと「欲求不満」と表示されました。

補足日時:2006/11/29 20:21
    • good
    • 0

もう少しヒントを下さい。



文字列を処理している部分のソース

「欲求不満」「早苗」が実際どう表示されたのか?

送信側のHTMLの文字コード
CGIのソースの文字コード
表示側のHTMLの文字コード

ちなみに、私の場合文字化け対策として行っているのは、
・CGIは全てEUCで書く
・フォームから受け取った文字列は必ずEUCに変換する
・HTMLに出力する直前でSJISなど、目的のコードに変換する

この回答への補足

御返答ありがとうございます。文字化けですが、
 「欲求不満」→「欲・s満」
 「早苗」→「・c」
という具合になります。
文字コードは送信側・ソース・表示側共にS-JISです。

補足日時:2006/11/29 15:31
    • good
    • 0

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