« IPAフォーラム 2006 での講演スライド | メイン | JavaScript の文字列定数でエスケープが必要な文字 »

2006年11月06日

Mozilla Firefox の JavaScript インタプリタが特定文字を読み落とす件 (JSON のエスケープ)

 Japanize において、ペルシア語の翻訳が一部動作しない問題注1を調査していたのですが、Mozilla Firefox (SpiderMonkey) は、JavaScript の文字列リテラル中の U+200C あたりを読み落とすようです注2

 たとえばこのスクリプトは 1 を返すべきだと思うのですが、 Firefox でクリックすると結果は 0 です。IE と Opera は大丈夫。

javascript:eval('var s = "\u200c"'); alert(s.length)

 SpiderMonkey のソースコード (js_GetToken のあたり) をちょっと眺めてみたのですが、挫折しました。とりあえず言えることとしては、

  1. たぶん ECMAScript の仕様に照らし合わせてバグ
  2. U+200C 以外にも読み落とす文字があるっぽい注3
  3. JSON を使用するアプリ (あるいはライブラリ) では回避策が必要注4
  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