murawaki の雑記

はてなグループから移転してきました

Mozilla で properties の key に特殊な文字を使うとはまる

他にも 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 に変換表をつっこむのが間違いなのだろう。