decodeURIを使ったらFirefox5.0がエラーを吐いたので調べた

こんにちわ。 世間はすっかり秋ですね。
僕は最近何故かヘトヘトです。
美味しいものでも食べて元気になりたいんですが、 そんなに収入もお金も無いので贅沢するのが怖い毎日です。

さて、さて、本題に入ります。

document.referrer

Javascriptはdocument.referrerを呼び出すことによって、
ユーザが前に見ていたサイトの情報を呼び出すことができます。
これによって、前に見ていたのがWebの情報だったら、
web関連の記事の情報をサイドバーに出したり…
といった処理を行うことが可能になります。

トラブルは突然やって来ました。

Firefoxでうまく動いていない…

行わせていた処理はとても単純なもので、
document.referrerを変数に代入→decodeURIでデコード
特定の日本語、"素敵やん"、"引退" などが含まれていたら要素を変える
といったものでした。

Jsの書き方が問題では無かった

最初はJsの書き方に問題があるのかと思っていたのですが、
Firefoxの3.6、6では問題なく動いていたので、
コンソールを見てみると、『URIError』というエラーが表示されていました。

文字コードが違う

まさか、と思いdocument.referrerで値を確認してみました。
ん…クエリは同じになるはずなのになぜか違っていました。
なので、こちら

URLエンコード/デコードフォーム

文字コードを調べてみました。

結果

Firefox5はUTF-8エンコードされたのではなく、SJISエンコードされていました。
decodeURIはUTF-8ではないバイト列をエンコードしたものはデコードできません。
なので、とりあえずSJISエンコードしたものも変数に入れて、
条件に追加してあげることで対応しました。

サイトがShift-JISだったのでそれも関係しているのかと思いましたが、
別なサイトでも同様の結果でした。