例の件はBに言って結局あきらめさせてもらうことにした。Aから催促が来た、と言われたからだ。もっとも自分の環境でXAMPPを入れてうまく動かないから(HTTPレスポンスがまともに帰ってこなかった。今日少し眺めて直したら何故か直ったけど。)ってVB.NETのコードに逃げたまま放置していたんだけど。(3週間ほど)
このブログの記述がその分野にわたっているのを見てもわかるでしょ?。
・・・そっちに夢中になってしまって(汗
Encode.pmやstrict.pmがないって言われたのでActivePerlを同じディレクトリに入れなおしたら動いた。
あまり興味を持たなかったから名前空間を省略する方法を調べていないので
激しく見にくいが、よくあるform要素(enctype="application/x-www-form-urlencoded")からpostで受け取る奴だ。
呼び出し元のHTMLもこのcgiファイルも文字コードUTF-8,改行コードLFで書かれている。なお、発注元Aがバレそうなところはこちらでソースから削除した。1行目に-Twがないのは、ないとエラーを起こすようだったから。
=======================================
#!"C:xamppperlbinperl.exe"
use encoding "UTF-8";
use Encode;
use strict;
package applicationform;
#標準入力から入力データをデータだけURLデコードして読み込んで連想配列に代入
sub readdata{
read (STDIN, $applicationform::PostData, $ENV{'CONTENT_LENGTH'});
@applicationform::Queries = split(/&/, "$applicationform::PostData");
for($applicationform::i = 0; $applicationform::i < $#applicationform::Queries + 1 ; $applicationform::i = $applicationform::i + 2){
@applicationform::varName = split(/=/, $applicationform::Queries[$applicationform::i]);
#本当はURLデコードは別ルーチンにしたい
#デバッグ
print "Before Encoden";
print "$applicationform::varName[0]n";
print "$applicationform::varName[1]n";
#URLデコード(どこかのページのコピーであり、=代入演算子以外に自分はなれていないのと、URLデコードのアルゴリズムを理解していないのと両方で)
$applicationform::varName[0] =~ tr/+/ /;
$applicationform::varName[1] =~ tr/+/ /;
$applicationform::varName[0] =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
$applicationform::varName[1] =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
#デバッグ
print "After Encoden";
print "$applicationform::varName[0]n";
print "$applicationform::varName[1]n";
#検証
#登録
$applicationform::Datas{"$applicationform::varName[$applicationform::i]"} = $applicationform::varName[0];
$applicationform::Datas{"$applicationform::varName[$applicationform::i+1]"} = $applicationform::varName[1];
}
}
#結果表示
sub outputresult{
print <<"EOF";
<html>
<head>
<title>送信結果</title>
</head>
<body>
<caption>送信された情報</caption>
</body>
</html>
EOF
}
#エントリポイント
sub main{
#デバッグのためにtext/plainにしてある。
#本来はoutputresultサブルーチンで出力するべきコード。
print "Content-Type: text/plain;charset=UTF-8;nn";
&readdata;
&outputresult;
}
#エントリポイント呼び出し
&main;
=====================================================
何が問題かというと、日本語を入力して送信するとAfter Encodeが表示できずに化けるということ。黒い菱形が表示されるだけだ。URLデコードを組み込んでいるにもかかわらずだ。この式自体が間違いなのか?
======================================================
Aへの返信を考えろと言われてしまったのでこれから返信内容を考える。
思えば何もしてないに等しい(Bにも指摘されている)から書きようが・・・難しい
このブログの記述がその分野にわたっているのを見てもわかるでしょ?。
・・・そっちに夢中になってしまって(汗
Encode.pmやstrict.pmがないって言われたのでActivePerlを同じディレクトリに入れなおしたら動いた。
あまり興味を持たなかったから名前空間を省略する方法を調べていないので
激しく見にくいが、よくあるform要素(enctype="application/x-www-form-urlencoded")からpostで受け取る奴だ。
呼び出し元のHTMLもこのcgiファイルも文字コードUTF-8,改行コードLFで書かれている。なお、発注元Aがバレそうなところはこちらでソースから削除した。1行目に-Twがないのは、ないとエラーを起こすようだったから。
=======================================
#!"C:xamppperlbinperl.exe"
use encoding "UTF-8";
use Encode;
use strict;
package applicationform;
#標準入力から入力データをデータだけURLデコードして読み込んで連想配列に代入
sub readdata{
read (STDIN, $applicationform::PostData, $ENV{'CONTENT_LENGTH'});
@applicationform::Queries = split(/&/, "$applicationform::PostData");
for($applicationform::i = 0; $applicationform::i < $#applicationform::Queries + 1 ; $applicationform::i = $applicationform::i + 2){
@applicationform::varName = split(/=/, $applicationform::Queries[$applicationform::i]);
#本当はURLデコードは別ルーチンにしたい
#デバッグ
print "Before Encoden";
print "$applicationform::varName[0]n";
print "$applicationform::varName[1]n";
#URLデコード(どこかのページのコピーであり、=代入演算子以外に自分はなれていないのと、URLデコードのアルゴリズムを理解していないのと両方で)
$applicationform::varName[0] =~ tr/+/ /;
$applicationform::varName[1] =~ tr/+/ /;
$applicationform::varName[0] =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
$applicationform::varName[1] =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
#デバッグ
print "After Encoden";
print "$applicationform::varName[0]n";
print "$applicationform::varName[1]n";
#検証
#登録
$applicationform::Datas{"$applicationform::varName[$applicationform::i]"} = $applicationform::varName[0];
$applicationform::Datas{"$applicationform::varName[$applicationform::i+1]"} = $applicationform::varName[1];
}
}
#結果表示
sub outputresult{
print <<"EOF";
<html>
<head>
<title>送信結果</title>
</head>
<body>
送信された情報
項目名 | 値 |
---|---|
お名前 | $applicationform::Datas{"Name"} |
ふりがな | $applicationform::Datas{"Furigana"} |
生年月日 | $applicationform::Datas{"BirthYear"}年$applicationform::Datas{"BirthMonth"}月$applicationform::Datas{"BirthDate"}日 |
性別 | $applicationform::Datas{"Gender"} |
住所 | $applicationform::Datas{"Address"} |
$applicationform::Datas{"Email"} |
</body>
</html>
EOF
}
#エントリポイント
sub main{
#デバッグのためにtext/plainにしてある。
#本来はoutputresultサブルーチンで出力するべきコード。
print "Content-Type: text/plain;charset=UTF-8;nn";
&readdata;
&outputresult;
}
#エントリポイント呼び出し
&main;
=====================================================
何が問題かというと、日本語を入力して送信するとAfter Encodeが表示できずに化けるということ。黒い菱形が表示されるだけだ。URLデコードを組み込んでいるにもかかわらずだ。この式自体が間違いなのか?
======================================================
Aへの返信を考えろと言われてしまったのでこれから返信内容を考える。
思えば何もしてないに等しい(Bにも指摘されている)から書きようが・・・難しい
※コメント投稿者のブログIDはブログ作成者のみに通知されます