理系学生日記

おまえはいつまで学生気分なのか

QUERY_STRING 中のパラメータの区切りは必ずしも '&' ではない

cricket とは SNMP を使って様々な機器から情報を取得し,CGI でグラフまで作成するという代物です.

ぼくはその CGI を愛でては溜息をつく,みたいな憂いのある午後を過ごしてたんですけど,どうも CGI に渡すパラメータがセミコロン (';') で区切られている.
あーあ,独自使用かよ嫌になるよなー,意味わかんないところこだわるなよなーとか思ってたところ,CGI.pm のソースをふと見ると,なんかさ,ばっちしセミコロンにも対応してんだけど!!!!

sub parse_params {
    my($self,$tosplit) = @_;
    my(@pairs) = split(/[&;]/,$tosplit);

これなんで! 独自仕様じゃなかったんや!!

RFC 見ても別にそんなの書いてないっぽいしなー,これどこで決まってんだろうとか思って Web を漁ってみてたら,どうも W3C で推奨されているらしい.

Unfortunately, the use of the "&" character to separate form fields interacts with its use in SGML attribute values to delimit character entity references. For example, to use the URI "http://host/?x=1&y=2" as a linking URI, it must be written <A href="http://host/?x=1&y=2"> or <A href="http://host/?x=1&y=2">.

We recommend that HTTP server implementors, and in particular, CGI implementors support the use of ";" in place of "&" to save authors the trouble of escaping "&" characters in this manner.

Performance, Implementation, and Design Notes

なるほどなるほど.
PerlCGI.pm だけど,Ruby もバッチシ対応しているみたいですから,とてもよかったですね.