Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

日本語nameのデータを受信

研究内容

フォームの name 属性が日本語になっている場合について研究します。

詳細

inputタグのnameについて

複数のデータが送られてきたとき、CGIプログラム側では、 input タグの name 属性に設定された名前を使ってデータを区別するんでした。 さて、この名前、これまでは input1 とか input2 とか、てきとうなものにしていましたが、 日本語にした場合はどうなんでしょう。OKなんでしょうか。研究してみましょう。

結果

getformdata関数をnameが日本語の場合に対応させる

これまで、name 属性が日本語であることは考慮していませんでした。 入力された文字列が日本語だった場合に備えてそれをデコードするようにはしましたが、 name の方はデコードしていませんでした。 この状態では、たとえフォームから正しく日本語の name でデータが送信されてきても、 CGIプログラム側では例の %〜 のままです。 ということで、getformdata 関数の修正が必要です。 デコードの方法はわかっていますから、ちょこっと変更するだけですね。

作成したCGIプログラム

getformdata.pl (少し修正しました)
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プログラムが開きます。 送信ボタンをクリックしてみてください。

(inputタグのname)(inputタグ)
フォーム1
フォーム2
フォーム3

考察

日本語でもOKですね

ちゃんと日本語の name がCGIプログラムに届きました。 日本語の name でもOKということですね! name は別に日本語不可だとしてもそれほど困らないですけど、 日本語がOKであるならCGIプログラム側でも日本語に対応しておいた方がいいですよね。 ということで、一度は完成したと思っていた getformdata 関数ですが、これで本当に完成!(…かな?)

…でも、もしかして

もしかして name が日本語でも大丈夫かどうかというのはブラウザによって違ったりするんでしょうか。 今回テストしたのは Internet Explorer なんですが、他のブラウザだとエラーになるなんてことがあるのかな? 外国産のブラウザとか。…そう考えると、name はやっぱり日本語を使わない方が良かったりするのかも知れませんね。 でもそれじゃ、なんのために getformdata 関数を修正したのか分かりませんね (^^;

分かったこと

  1. name 属性は日本語でもOKでした。ただし、Internet Explorer の場合。
  2. 「Mac OS 10.4.6上のSafari 2.0.3でもちゃんと動作しましたよ!」とのご連絡を頂きました(^^
  3. 他のブラウザの場合は分かりません…
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。