Firefoxの検索プラグインが読み込まれない理由:犯人は「&」

うちのFirefoxくんはどうやら検索プラグインが大嫌いなようで、きちんと検索プラグインを書いたつもりでも、Firefox側で読み込んでくれないという症状が多発していて本当に困りもの。
例えばFirefox 2 の検索プラグイン (検索バー) その2で紹介されている、以下のような英辞郎 on the Web用検索プラグインを読ませてみる。これはOpenSearchフォーマットですね。

<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
                       xmlns:moz="http://www.mozilla.org/2006/browser/search/">
<ShortName>英辞郎 on the Web</ShortName>
<Description>英辞郎 on the Web</Description>
<Image height="16" width="16" type="image/vnd.microsoft.icon">http://eow.alc.co.jp/favicon.ico</Image>
<Url type="text/html"
     method="GET"
     template="http://eow.alc.co.jp/{searchTerms}/UTF-8/" />
<moz:SearchForm>http://www.alc.co.jp/</moz:SearchForm>
<InputEncoding>UTF-8</InputEncoding>
<OutputEncoding>UTF-8</OutputEncoding>
</OpenSearchDescription>
Firefox 2 の検索プラグイン (検索バー) その2 - コンピュータ系blog

ファイル名は適当にeijirou.xml文字コードも適当にUTF-8のCR+LFとしておいた。設置場所はプロファイルフォルダ\searchplugins直下。
設置後にFirefoxを起動すると、自動的にMozilla独自のMozSearch形式に書き換えられるようだ*1。書き換えられた後のeijirou.xml文字コードがUTF-8N LFに変更され、内容は以下のようになっていた。

<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/">
<os:ShortName>英辞郎 on the Web</os:ShortName>
<os:Description>英辞郎 on the Web</os:Description>
<os:InputEncoding>UTF-8</os:InputEncoding>
<os:Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////ANPT0/2mpqb9jo6O/Z2dnf3AwMD94+Pj/f///wD///8A////AP///wD///8A////AP///wD///8Aubm5/V1dXf17e3v9srKy/c7Ozv3Ly8v9p6en/X19ff2bm5v9////AP///wD///8A////AP///wD///8Al5eX/Wlpaf3o6Oj9/////f////3////9/////f////3+/v792dnZ/YKCgv3l5eX9////AP///wD///8A4+Pj/VBQUP339/f9/v7+/f////3////9/////f////3////9/////f7+/v339/f9jY2N/dPT0/3///8A////AP///wCwsLD9ZmZm/c3Nzf3////9/////f////3////9/////f////3////9/v7+/e7u7v2YmJj9////AP///wD///8A////AP///wCEhIT9hISE/fDw8P3////9/////f////3////9/////f////3////9k5OT/f///wD///8A29vb/f///wD///8A////AMrKyv1dXV39zs7O/f////3////9/////f////3////9/////cPDw/26urr9tbW1/V1dXf1wcHD9cXFx/Wlpaf1tbW39WVlZ/REREf2YmJj9/////f////3////9/////f////3g4OD9mJiY/c3Nzf2ysrL9/////f////3////9/////fv7+/3s7Oz95eXl/f////3////9/////f////3////95ubm/YyMjP3///8AfHx8/f7+/v3////9/////f////3////9/////f////3////9/////f////3////9/////d/f3/2MjIz9////AJGRkf3W1tb9/v7+/f////3////9/////f////3////9/////f////3////9/////f////2zs7P9qKio/f///wD///8AdHR0/fr6+v3////99/f3/eHh4f39/f39/////f////3////9/////f////38/Pz9Z2dn/f///wD///8A////ALW1tf18fHz9/v7+/bOzs/1RUVH9wMDA/f////3////9/////f////3+/v79np6e/X9/f/3///8A////AP///wD///8AhYWF/XBwcP21tbX9qKio/eHh4f3////9/////f////38/Pz9k5OT/XV1df3///8A////AP///wD///8A////AP///wCgoKD9JiYm/VhYWP2hoaH91NTU/c7Ozv2Xl5f9XFxc/ZSUlP3///8A////AP///wD///8A////AP///wD///8A////AOjo6P2kpKT9aGho/UxMTP1ubm79sLCw/f///wD///8A////AP///wD///8A+B8AAOAPAADAAwAAgAEAAMABAADwAQAAuAAAAAAAAAAAAAAAgAAAAIAAAADAAQAAwAEAAOADAADwBwAA+B8AAA==</os:Image>
<SearchForm>http://www.alc.co.jp/</SearchForm>
<os:Url type="text/html" method="GET" template="http://eow.alc.co.jp/{searchTerms}/UTF-8/">
</os:Url>
</SearchPlugin>

このeijirou.xmlは正常に読み込まれ、検索バーに追加された。
ところで、実は今私が追加したいのは、QRコードを作成する検索プラグインである。QRコードを作成してくれるサービスは数多あるが、個人的な好みでQRコードBlog QRコード無料作成フォームをセレクト。
まずは、OpenSearchの書式に従って一から作成してみる。文字コードUTF-8 CR+LFで以下のようなqrcode.xmlを作成した。

<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
                       xmlns:moz="http://www.mozilla.org/2006/browser/search/">
<ShortName>QRコード作成</ShortName>
<Description>QRコードBlog QRコード無料作成フォーム</Description>
<Image height="16" width="16" type="image/vnd.microsoft.icon">http://www.qrcodeblog.com/favicon.ico</Image>
<Url type="text/html"
     method="GET"
     template="http://www.qrcodeblog.com/date/qrcgi/perl/qr_img.cgi?d={searchTerms}&e=M&v=0&s=5" />
<moz:SearchForm>http://www.qrcodeblog.com/date/qrcgi/</moz:SearchForm>
<InputEncoding>Shift_JIS</InputEncoding>
<OutputEncoding>Shift_JIS</OutputEncoding>
</OpenSearchDescription>

結果は…読み込んでくれないのである。みなさんは理由がおわかりでしょうか?

犯人はヤス

犯人は、URLに含まれる「&」でした。そうですよね!CDATAじゃなくてPCDATAだから&は&amp;と書かないといけないんですよね!基本ですよね!!!
わかってみるとほんとに簡単なことなんだけど、分からない時はわからないんですよね…。
長かった割にオチが弱いんですが、同じ罠にはまっている人の参考になればと思います。はい。

今回のまとめ

*1:ということはつまり、Firefox2はOpenSearchを「採用した」というのはそうやら勘違いだったらしい。あくまでOpenSearchには「対応した」だけであり、実際にはFirefox2独自の検索プラグインフォーマットであるMozSearchを依然として使用している。Mozillaが独自路線を突っ走る理由はよくわからない…。

*2:FirefoxならばMozSearchに自動で書き換えられる際にbase64エンコードされてxml内に保存されるので問題ないが、OpenSearchネイティブ対応のアプリケーションだと、実装によっては起動の度にWeb上のリソースを参照しに行くのかも。それは色々とまずいんじゃないか…?

*3:base64へのエンコードThe data: URI kitchenが便利。