jQuery の $.getJSON() と IE ではまった

今つくっているサイトでは,html のエンコーディングShift_JIS にしてるんで,合わせるために JavaScriptエンコーディングShift_JIS にしてます(jQuery だけは念のため UTF-8 指定してますけど)。

で,そこで JSON データをやりとりしているんですが,全部 Shift_JIS に統一していたんで,

JSON を吐くようにしていたんですが,どうも IE 6 で挙動が安定しない。

初回の Ajax ネゴのときにはうまくいっても,そこからブラウザで「進む」「戻る」してもう一度 Ajax ネゴると文字化けしたり,初回の Ajax ネゴから文字化けどころかまったくやりとりできなかったり。

うーむ,と思ってネットをいろいろあさっていたら,

な記事を発見したんですが,元サイトがリニューアル中で何が書いてあったか不明。気になる〜。

じゃあってことで元ネタを探してみたらちょっと古い記事ですが,

というのを発見。JSON の Content-Type を text/html で返すと危ないよ,とのことですけど,頭がわるいので,この記事の前半と後半(exploit)のつながりがいまいちわからない。

ともあれ,text/javascript というのは obsolete ですか。でも RFC がどうこういっても実際の実装はブラウザによりけりですよね。と思いもちょっとたぐってみると,これもちょっと昔の記事ですが

このサイトを合わせて見ると,Opera 8.5 だと text/x-javascript がベターぽくて,(当時の)Safari のことを考えると charset 指定はしたほうがいいっぽい。

ということで,x-javascript にしようかとも思ったんですが,結局,文字化けがらみだし〜ということで

  • Content-Type: application/json; charset=UTF-8

にしてみました。実質文字コードを変えただけです。


一応 IE で安定したっぽいし,Opera 9.23 だとこれでも OK でした。Safari 2.x でも OK。

結論。コンテンツを Shift_JIS に統一していても少なくとも JSON データの charset は UTF-8 のほうが無難?

ちなみに jQuery を読解してみたら,json のパースは eval を使っているぽい。JSONP でなければまぁ eval でも構わないというかサーバアプリサイドの責務にしちゃってもいいかなと私も思います。

おまけ:やはり jQueryIE ではまったところ

<select id="hoge">
    <option>hahaha</option>
    <option>fufufu</option>
</select>

みたいな html で,

$('#hoge').val('fufufu');

とすると,Firefox / Opera / Safari だとうまく選択されるのに,IE だとブランクになってしまいます。

面倒でも

<select id="hoge">
    <option value="hahaha">hahaha</option>
    <option value="fufufu">fufufu</option>
</select>

みたく value を指定しておかないとだめでした。