他にも Mozilla でまったのでメモ。今度は stringbundle の properties で key に特殊な文字を使ったら駄目だった。
やりたいことは、キーボードの入力を適当な言語の文字に変換すること。この変換テーブルをどうやって記述するか。indicime と同じ様に properties ファイルに記述してみることにした。properties ファイルは、XBL の stringbundle 要素に記述することによってロードする。
properties ファイルには、key=value という形式の property が並んでいる。ここで、
!=1 #=3
と記述すると認識されない。! と # はコメント開始という仕様だから、これらの行はまるごと無視される。
しかし、エスケープして
\!=1 \#=3
と記述した上で
stringbundle.getString("!");
としても値が得られない。dump を見ると Failed to get string という stringbundle.xml のエラーが出力されている。
結論から言うと、key は unescape されないので、
stringbundle.getString("\\!");
として \! という key を見れば 1 が入っている。
properties ファイルを parse するのは nsPersistentProperties.cpp だが、ここでは value しか unescape されていない。この挙動は Java の仕様 と異なっている。バグと言っても良いのではないか。調べた限りではバグ報告されていないが。
そもそも properties に変換表をつっこむのが間違いなのだろう。