URLエンコードとURLデコード

URLエンコードとは「スペース以外を%HH形式に変換し、スペースを+に変換する」などの仕様については軽く流しておいて、実際にどう使うかメモしておく。ちなみにPHPではいつもアンダースコアを混ぜてしまいsyntax errorを出すのはお約束になっています。

PHPでURLエンコード

rawurlencode( $uri );

PHPでURLデコード

rawurldecode( $uri );

rawが付かないものは、いつかどこかで不具合を起こすかもしれないので、つけておいたほうが無難です。
そして、エンコードの結果は大文字になっているので、他のスクリプトと連携させるときには注意すること。
ローカルはWindowsで動いているのに、リモートにアップしたとたん大文字小文字の違いで動かなくなったりなどよくあること。
ちなみに、Perlでよく使われる以下のようなURLデコードは小文字に変換されます。

PerlでURLエンコード

sub url_encode( $ ){
	my $str = shift;
	$str =~ s/([^\w ])/'%'. unpack( 'H2', $1 )/eg;
	$str =~ tr/ /+/;
	return $str;
}

PerlでURLデコード

sub url_decode( $ ){
	my $str = shift;
	$str =~ tr/+/ /;
	$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack( 'H2', $1 )/eg;
	return $str;
}

この場合に問題になるのはエンコードのほうで、デコードはほとんど関係有りません。エンコードで大文字にするか小文字にするかは、どちらかに決めておいたほうがいいかもしれませんが、ブラウザで表示されるのは一般的に大文字なので、PerlのURLエンコードにはuc()の追加をお勧めします。つまり次のようになります。

PerlでURLエンコード

sub url_encode( $ ){
	my $str = shift;
	$str =~ s/([^\w ])/'%'. uc( unpack( 'H2', $1 ) )/eg;
	$str =~ tr/ /+/;
	return $str;
}

間違えてはいけないのは、RFC1738には、大文字と小文字の両方が表記されており、「大文字で無ければならない」のではなく、「大文字の方が何かと都合がよい」ということです。PHPと連携させなければ特に考えなくてもいいです。
packはコピペが多く、それほど使いこなせているわけでもないので、他に方法がありそうな気もしますが、見慣れたコードに関数を追加するという明瞭な方法をとることも可読性という意味では大事でしょう。Perlに可読性を求めるなといわれそうですが。