« IPAフォーラム 2006 での講演スライド | メイン | JavaScript の文字列定数でエスケープが必要な文字 »
2006年11月06日
Mozilla Firefox の JavaScript インタプリタが特定文字を読み落とす件 (JSON のエスケープ)
Japanize において、ペルシア語の翻訳が一部動作しない問題注1を調査していたのですが、Mozilla Firefox (SpiderMonkey) は、JavaScript の文字列リテラル中の U+200C あたりを読み落とすようです注2。
たとえばこのスクリプトは 1 を返すべきだと思うのですが、 Firefox でクリックすると結果は 0 です。IE と Opera は大丈夫。
SpiderMonkey のソースコード (js_GetToken のあたり) をちょっと眺めてみたのですが、挫折しました。とりあえず言えることとしては、
- たぶん ECMAScript の仕様に照らし合わせてバグ
- U+200C 以外にも読み落とす文字があるっぽい注3
- JSON を使用するアプリ (あるいはライブラリ) では回避策が必要注4
- ペルシア語圏では AJAX はポピュラーじゃないっぽい
20:29 追記:
デバッガで追ってみました。js_GetToken 内で FORMAT 属性をもつ文字をスキップしてるのが原因ですか。文字列定数の場合だけ特別扱いすればいいのかな。というか、他の js_GetToken を呼び出してる箇所も ECMA incompliant になってたりしないのかなぁ...。
で、どの文字が FORMAT 属性をもつのかは (SpiderMonkey 的には) Java (≠JavaScript) の仕様を見ろってことらしい。
2006/11/7 追記:
JavaScript の文字列定数でエスケープが必要な文字 に、ブラウザ毎にエスケープが必要な文字をまとめておきました。
注1: fivepointfive 氏の推測どおりだったわけです
注2: 文字列リテラル以外の部分の動作については不明
注3: U+200D 等
注4: 少なくとも Perl の JSON には回避策は実装されてないっぽい
投稿者 kazuho : 2006年11月06日 15:57
トラックバック
このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/873