METHOD=POSTで設定したフォームの情報が文字化けしないようにするには?

[上に] [前に] [次に]
猫田 [HomePage] 1999/06/23(水) 18:47:00
フォームで入力された情報を取り出すCGIについて質問です。METHOD=POSTで設定したフォームのテキストエリアに大量の文字(全角で400字以上のデータ)を入力してCGIを呼び出し、標準入力に返される値を参照すると時々一部が文字化けすることがどうしてでしょうか?入力する文字数が多いほど化ける確立が高くなります。全角で400〜600文字のときは100回に一回程度の頻度ですが、1500文字で試したところほぼ50%の確立で一部が文字化けします。

PTAN 1999/06/23(水) 18:53:42
何という言語で、CGIを作って、どういったデコードしているのか
書かないと、答えようがないと思いますが。

ふじ 1999/06/23(水) 21:13:46
ついでに、具体的な化け方も示して貰えると手掛かりになるかと。

猫田 [E-Mail] 1999/06/23(水) 23:40:33
使用言語はPerlです。試したCGIを引用します。

#!/usr/bin/perl

$| = 1;

read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
$buffer = $buf;   #比較のためにデコードしていない状態のデータを$bufferに代入
####デコード処理開始####
@pairs = split(/&/, $buf);
foreach $item (@pairs){
($key, $value) = split(/=/, $item);
$key =~ tr/+/ /;
$key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$key} = $value;
}
####デコード処理終了####
print <<FIRST_PART;
Content-type: text/html

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=shift-jis"></META>
</HEAD>
<BODY>
FIRST_PART
foreach $n (sort keys %FORM){
print($n.":$FORM{$n}<BR>\n");   #デコードしたデータを表示
}
print $buffer;                           #デコード前のデータを表示
print "</BODY></HTML>";

文字化けが発生するときはデコード前のデータの16進数の表示もおかしくなっています。よってデコード方法が間違っているとは思えません。

上記の現象はCGIが設置してあるサーバとLAN経由で接続している環境で確認しましたが、今、家からダイアルアップで接続して問題のCGIを起動してみると全く文字化けしません。全角で8892文字のデータを入力しても全然大丈夫でした。LAN経由でCGIを呼んだのがよくなかったんでしょうか?

B-Cus 1999/06/24(木) 00:29:28
そのperlはEUCしか扱えないのでは?
SJISには `\'(0x5c)などが含まれてますから、SJIS非対応の
perlでデータを読んで print "$_" で書き出すだけで化けます。

B-Cus 1999/06/24(木) 00:41:37
> perlでデータを読んで print "$_" で書き出すだけで化けます。
あ、嘘。これじゃ化けない。SJISでスクリプトを書くと、
  print "ソフト";
とすると
 ャtト
と表示される、ってこと。

mm 1999/06/24(木) 02:16:12
ブラウザがFORMで日本語文字を送るとき、どのような場合に
JISとShift-JISとEUC(Unicodeも?)のいずれのコードが使われるのか、
って問題は解決してましたっけ?>回答者の皆さま

猫田さんのスクリプトは、ブラウザがShift-JISで送信する
ってことが前提になってるようですが、これが違うコードに
なってるってことはないでしょうか?

>文字化けが発生するときはデコード前のデータの16進数の表示も
>おかしくなっています。
この16進の内容(ごく一部でいいです)を書いて頂けると、
直ぐに分かると思います。%1Bが混じっていれば、JISコードで
送信されてます。

猫田 1999/06/24(木) 09:29:48
テキストエリアに「テストです。」という文字列を300個入力して
CGIを呼び出したところ5回目で文字化けが発生しました。
以下にデコード前とデコード後のデータを示します。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
デコード前→デコード後
%83e%83X%83g%82%C5%82%B7%81B→テストです。
%83e%83X%83g%82%C5%82%B7%B→テストです%B
−−−−−−−−−−−−−−−−−−−−−−−−−−−−
文字化けしたのは1箇所のみです。

それと、ダイアルアップで接続してCGIを起動してもやっぱり
文字化けしてました。

徳明 1999/06/24(木) 12:23:49
コードはちゃんとシフトJISで送られているようですね。
でも、shift-jis は shift_jis が正しかったような。
それと、shift_jisで書き出すのであれば、jcode.plなどを用いて
シフトJISに変換してから書き出すのがよいと思う。
でも、デコード前から化けているのだとすると、ブラウザの
バグである可能性が高そう・・・

猫田 1999/06/24(木) 16:45:53
ブラウザのバグですか。IE4.01とNC4.5でテストしてみましたが
両方ともたまに一部のデータが文字化けしました。
とほほさんの「wwwboard.cgi」でも実験してみましたが、同様に
大量のデータを入力するとたまに一部が化けて表示されました。

mm 1999/06/25(金) 01:12:36
FORMやCGIのcharsetを外してみては…
と思っていたのですが、とほほさんの「wwwboard.cgi」でも
ダメってことは、文字コードの問題ではないんですね。

となると、ブラウザの<TEXTAREA>の編集バッファのサイズに
制限があるのかな…?

行バッファの制限なら、改行の問題かも…
テスト用の文字列には、改行は入ってないのでしょうか?
もし、入ってないのなら、適当に改行を入れてみて、
もう一度試してみるとか…

PTAN 1999/06/25(金) 09:24:38
> ブラウザのバグですか。IE4.01とNC4.5でテストしてみましたが
> 両方ともたまに一部のデータが文字化けしました。

となると、ブラウザが原因とはいいにくそうですね。
もしかして、Webサーバが正しくCGIにデータを渡していないとか、
間のネットワークがおかしいとか...???
とりあえず、同一のCGIを別のWebサーバで試してみてはどうでしょう。AN HTTPDとか。

猫田 1999/06/25(金) 10:51:08
[[解決]]
改行が入ったテストデータでもうまくいきませんでした。
でも、AN HTTPDで試してみたら大丈夫でした。全角で6144文字の
データで100回テストして、一度も文字化けがでませんでした。
Webサーバが悪かったみたいですね。サーバの管理人の人に
聞いてみます。みなさんいろいろとありがとうございました。
また何かありましたらお世話になると思いますのでそのときは
よろしくおねがいします。

[上に] [前に] [次に]