|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
フォームの name 属性が日本語になっている場合について研究します。
複数のデータが送られてきたとき、CGIプログラム側では、 input タグの name 属性に設定された名前を使ってデータを区別するんでした。 さて、この名前、これまでは input1 とか input2 とか、てきとうなものにしていましたが、 日本語にした場合はどうなんでしょう。OKなんでしょうか。研究してみましょう。
これまで、name 属性が日本語であることは考慮していませんでした。 入力された文字列が日本語だった場合に備えてそれをデコードするようにはしましたが、 name の方はデコードしていませんでした。 この状態では、たとえフォームから正しく日本語の name でデータが送信されてきても、 CGIプログラム側では例の %〜 のままです。 ということで、getformdata 関数の修正が必要です。 デコードの方法はわかっていますから、ちょこっと変更するだけですね。
package plab;
sub getformdata
{
local $rawdata;
local %formdata;
local @inputs;
local($input, $name, $val);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $rawdata, $ENV{'CONTENT_LENGTH'});
}
elsif ($ENV{'REQUEST_METHOD'} eq "GET") {
$rawdata = $ENV{'QUERY_STRING'};
}
@inputs = split('&', $rawdata);
foreach $input (@inputs) {
($name, $val) = split('=', $input);
$name =~ tr/+/ /;
$val =~ tr/+/ /;
$name =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
$val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
$formdata{$name} = $val;
}
return %formdata;
}
1;
name 属性が日本語なフォームです。 以前作った、フォームのデータを一覧表示するCGIプログラムが開きます。 送信ボタンをクリックしてみてください。
ちゃんと日本語の name がCGIプログラムに届きました。 日本語の name でもOKということですね! name は別に日本語不可だとしてもそれほど困らないですけど、 日本語がOKであるならCGIプログラム側でも日本語に対応しておいた方がいいですよね。 ということで、一度は完成したと思っていた getformdata 関数ですが、これで本当に完成!(…かな?)
もしかして name が日本語でも大丈夫かどうかというのはブラウザによって違ったりするんでしょうか。 今回テストしたのは Internet Explorer なんですが、他のブラウザだとエラーになるなんてことがあるのかな? 外国産のブラウザとか。…そう考えると、name はやっぱり日本語を使わない方が良かったりするのかも知れませんね。 でもそれじゃ、なんのために getformdata 関数を修正したのか分かりませんね (^^;
|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
| Copyright (c) 'PERL-LABO' All Rights Reserved. リンクフリーです。 |