[/Top /パッチワーク/ゆいちゃっと研究/URLエンコード]

URLエンコードのこと


ブラウザのURL表示で、
http://www.test.com/chat/chat.cgi?name=%a4%e6%a4%a4&chat=%a4%aa%a4%cf%a4%e8
のように、%??%??という表示を見たことがあるかと思いますが、これがURLエンコードなるもの....です。

http://www.test.com/chat/chat.cgi?name=ゆい&chat=おはよ
のように、全角文字等を直接書いても、ほとんど問題ないことが多いのですが、
本来は、ちゃんと、URLエンコードしなくてはいけません。(苦笑)
(サーバに迷惑を少しかけるとか、UNIXブラウザで困るとか...いろいろ問題が...)
どんな時に問題になるかといいますと、
そもそもCGIに値を渡す時は、
http://www.test.com/test.cgi?NAME1=VALUE1&NAME2=VALUE2&NAME3=VALUE3&
のように、cgiの後ろに?を付けて、各項目を&で区切って、NAME,VALUEを=で結ぶのが一般的です。

ここで、もし、VALUE1に?,&,=といった文字が含まれるとどうなるでしょう。
(VALUE1→”?と&と=だよん”ってことね。)
http://www.test.com/test.cgi?NAME1=?と&と=だよん&NAME2=VALUE2
サーバーは、&と=だよん&というところで、おかしな処理をすることになってしまいます。

URLエンコードのやり方
◆URLエンコードされていない元のスクリプト

print "http://www.xxx.com/test.cgi?name=$name&chat=$chat\n";
◆URLエンコードするように改良したスクリプト

$xname=$name;#別の名前の変数にコピー
&encode($xname);#URLエンコードする。
$xchat=$chat;#別の名前の変数にコピー
&encode($xchat);#URLエンコードする。

print "http://www.xxx.com/test.cgi?name=$xname&chat=$xchat\n";
#$nameの代わりに$xname、$chatの代わりに$xchatを使う
#

###################
#追加すべきサブルーチン
sub encode {
$_[0] =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
$_[0] =~ s/\s/+/g;
$_[0];
}
改良方法は簡単で、上記のようにencode サブルーチンをファイルの一番最後など適当な場所に追加し、 変数をコピーして、エンコードしてから URLに用いれば完了です。

場合によっては、下記のように済ませることも可能です。
URLエンコードするように改良したスクリプト
&encode($name);#URLエンコードする。
&encode($chat);#URLエンコードする。

print "http://www.xxx.com/test.cgi?name=$name&chat=$chat\n";
###################
#追加すべきサブルーチン
sub encode {
$_[0] =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
$_[0] =~ s/\s/+/g;
$_[0];
}

私のように、手抜きスクリプトをよく書く人は、ときどきURLエンコードしないばっかりに トラブルに巻き込まれることがありますので、このテクニックだけは覚えておきましょう。



この文章は、必要最低限のメモ文書です(笑)
もっと詳しく、厳密に知りたい人は、RFC等を調べましょう。
[/Top /パッチワーク/ゆいちゃっと研究/URLエンコード]