URI の中に & を書くべからず

URI の中の &

@ホペではアクセスカウンタの CGI が提供されていますが、その書式は以下のように説明されています。

<img src="http://hpcounter1.nifty.com/cgi-bin/counter.cgi?u=CQS02437&p=9&c=8">

これは駄目です。URI の中でも、& を書くときは &amp; としなければなりません。

HTML において、& は CRO(文字実体参照開始区切り子)です。たとえば、&lt; と書くと、これは "<" という文字に置換されます。href属性の中でも例外ではありませんので、たとえば

<img src="http://hpcgi1.nifty.com/bakera/test.cgi?lt=5&gt=4">

と書いてあったとすると、ブラウザはこの属性値を

http://hpcgi1.nifty.com/bakera/test.cgi?lt=5>=4

と展開し、CGI には "lt=5>=4" というデータが送られてしまいます。

これを回避するためには、& の代わりに &amp; か &#38; を使えば良いのです。

<img src="http://hpcgi1.nifty.com/bakera/test.cgi?lt=5&amp;gt=4">

&amp; は & に展開されますから、CGI には "lt=5&gt=4" が送られます。

動くじゃん?

しかし実際には、& のままでも前述のアクセスカウンタは動作します。なぜ動くのかというと、それはたまたま &p; や &c; という実体が定義されていないからです。多くのブラウザはこれを不明な実体参照とみなし、展開を行いませんので、結果として &p=9&c=8 というデータが送られ、カウンタは動作します。しかし、&p を ? などに置き変えてしまうブラウザがあったとしても文句は言えないのです。

そういうわけで、HTML の中では、きちんと &amp;p=9&amp;c=8 、あるいは &#38;p=9&#38;c=8 と書くようにすべきです。特に XHTML の場合、XML では文字参照でない & を単独で書くことができませんから、Well-formed ですらなくなってしまいます。

なお、これは HTML の中に限った話で、ブラウザの URL 入力欄に直接打ち込む場合などはそのままで構いません。当たり前ですが、ブラウザの URL 入力欄に打ち込んだ URL は、HTML としてパースされたりしませんから、文字参照が展開されることもなく、そのままサーバに送られることになります。


HTMLむだ話

HTML鳩丸倶楽部

水無月ばけら, MINAZUKI Bakera
E-mail: bakera@star.email.ne.jp