- 2006-06-15 (木)
- Javascript
日本語の文字化けまわりで何かと話題に挙げられる事の多いMac OS XのSafariですが、www.json.orgにて配布されているjavascript側のJSON用ライブラリ json.js も期待通りに動かなくて小一時間ハマりました。
不具合 - 日本語が含まれるUTF-8文字列をparse出来ない
var s = '{"key":"value"}'; var obj = s.parseJSON(); alert(obj.key); // 結果: value
通常は上記のように JSON な文字列を parseJSON() メソッドにかけてあげることで javascript オブジェクトに変換されるのですが、 この文字列にUTF-8な文字列(日本語)が含まれていると、Safariの場合に限り、うまく動作しません:
var s = '{"key":"値"}'; var obj = s.parseJSON(); alert(obj.key); // 結果: undefined
obj 自体が undefined になります。ディープに調査してないのですが、見た感じ、parseJSON() メソッドの中で行っている正規表現置換に問題がありそう。Safari の javascript runtime が、正規表現の中でマルチバイト文字をうまく認識できていない感じがします。
不具合確認環境 - Safari 1.3.2 および 2.0.3
解決策 - json.js は使わず eval() で対処
以下のように eval() を使って変換してしまうべし:
var s = '{"key":"値"}'; var obj = eval('(' + s + ')'); alert(obj.key); // 結果: 値
かっちょいい解決策はわかりません(汗)。とりあえず、JSON文字列 → javascript オブジェクトへの変換だけならば、json.js 使わずとも eval() で事足りるので、まぁいいかと。 ※じゃあ parseJSON() は何の為にあるのか、ちょっと気になりますが・・・今は無視する方向で。 以上、
Safariでも動作するAJAXサービスを作る際は、JSON変換は eval() を使うべし
という事で・・・いいのかな?多分。
※ファイルにBOMつければイケるのでは?と思って試したもののNGでした。
関連情報
- JSONとContent-Type - blog.nomadscafe.jp
- Ajax で文字化けする条件を調査してみた - bricklife.weblog.*
- Newer: SafariでAJAX - Scriptエレメントとして読み込むjavascriptソースは、charsetをヘッダで指定した場合でも文字化けする
- Older: いつでもどこでも、すぐに DateTime モジュールを使いたい
Comments:1
- ぬこ 2007-07-08 (日) 21:47
-
> じゃあ parseJSON() は何の為にあるのか
おそらくセキュアなevalということなんでしょう。
そのままevalすると、不正データがJSONに含まれていた場合、ブラウザをクラッシュさせてしまう危険性を孕んでいます。