こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

document.writeからcgiへ出力すると文字化けします。

フォームへ入力したデータを、いったんJavaScriptのdocument.writeでプレビューして、そこからCGIへ出力するプログラムを書いています。

プレビューせずにCGIに出力すると問題ないのですが、document.writeで出力すると、日本語が文字化けしてしまいます。半角英数字は大丈夫です。
document.writeした状態のソースをhtml化して出力するとこれまた大丈夫なのです。
コードを変えたり、jcode.plを利用させもらったりしたのですが、変わりませんでした。

CGIファイルのほうは途中で、この後、$valueをテキストファイルに出力したいと思っています。

もしお暇なときにでも、理由と対策を教えていただければ幸いです。
まだ不慣れなので、おかしいことをしていたら申し訳ありません。もっといい方法があれば、ぜひ教えてください。

入力用ファイル

<html>
<head>
<script type="text/javascript">
function aaa(){
a=document.ff.tname.value;
b=document.ff.tsono.value;
document.write('<html>\n<head>\n</head>\n<body>\n');
document.write('<form name="ff0" method="post" action="test3.cgi">\n');
if(a==""){document.write('お名前欄が空です!<br>\n')};
if(b==""){document.write('その他欄が空です!<br>\n')};
document.write('お名前:<input type="text" name="t0name" style="border:none;font-size:16;" value="'+a+'"><br>\n');
document.write('その他:<input type="text" name="t0sono" style="border:none;font-size:16;" value="'+b+'"><br>\n');
document.write('<input type="button" value="戻る" onmousedown="window.history.back()">')
if((a!="")&&(b!="")){
document.write('<input type="submit" value="送信">\n');
}
document.write('</form>\n</body>\n</html>');
}
</script>
</head>
<body onload="document.ff.tname.focus();">
<form name="ff" method="post" action="">
お名前:<input type="text" name="tname" style="ime-mode:active"><br>
その他:<input type="text" name="tsono" style="ime-mode:inactive"><br>
<input type="button" value="確認" onmousedown="aaa()">
</form>
</body>
</html>

CGIファイル

#!C:\Perl\bin\perl
print "Content-type:text/html\n\n";

read (STDIN,$aaa,$ENV{'CONTENT_LENGTH'});

print "<html>\n<head>\n</head>\n<body>";

@bbb=split(/&/,$aaa);

foreach $ccc(@bbb){
($name,$value)=split(/=/,$ccc);
$value=~ tr/+/ /;
$value=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
print "$nameは$valueです。";
}

print "</body>\n</html>";

投稿日時 - 2008-03-15 23:36:03

QNo.3866347

暇なときに回答ください

質問者が選んだベストアンサー

form からの送信データの文字コードは、その form の文字コードと同じも
のになります。つまりサーバから SHIFT_JIS で送られた form の送信デー
タは、SHIFT_JIS になり、EUC-JP の form の送信データは EUC-JP になり
ます。

javascript で form ページを作り直しているため、この対応が崩れている
のではないでしょうか。作り直した form の送信データはおそらく UTF-8
になっていると思います。

jcode.pl は、UTF-8 に対応していないようですので、UNICODE に対応した
Jcode.pm を使って受信したデータを変換するとよいのではないでしょう
か。

投稿日時 - 2008-03-16 09:55:02

お礼

早々に回答いただきありがとうございます。
どうやら、UTF-8に変換されていたようで、対応のモジュールを利用したところデコードできました。

投稿日時 - 2008-03-16 21:24:01

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

ブラウザからCGIへの入力は文字コードが特定できないので、EncodeやJcodeを利用して受け取ったデータの文字コードを変換する必要があると思います。
jcode.plはunicodeに対応しないので、あまりオススメできないかもしれません。

投稿日時 - 2008-03-16 09:55:14

お礼

早々に回答いただきありがとうございます。
どうやら、UTF-8に変換されていたようで、対応のモジュールを利用したところデコードできました。

投稿日時 - 2008-03-16 21:24:29

あなたにオススメの質問