よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

September 13, 2008 [おもひで]

[Ruby] BOM付きpoファイルとupdatepo

Ruby-GetTextのupdatepo時にBOM付きのpoファイルがあると以下のようなエラーメッセージが出てしまう、という指摘があった。

foo.po:1:2: syntax error
msgmerge: 1 個の致命的エラーが見つかりました

BOMはユニコードなテキストファイルの先頭に付ける、2 or 3バイトのバイト列で、例えばnotepad.exeなどで編集・保存すると勝手に付けられてしまう。
これは、GNU msgmerge(少なくとも0.17までは)自体がBOMを受け付けてくれないのが問題だと思うんだけど、poファイルは「翻訳者が扱うファイルであり、プログラミングできない人でも見ればだいたい翻訳することができる」というモノを目指してるわけで、そういう人たちにnotepad.exeを使うなというのは酷というものだ。とりあえずRuby-GetText側で何とかしたい。

というわけで、以下のようなメソッドを使ってupdatepoするタイミングでpoファイルからBOMを削除することにした。

  BOM_UTF8 = [0xef, 0xbb, 0xbf].pack("c3")
  def remove_bom(path)  #:nodoc:
    bom = IO.read(path, 3)
    if bom == BOM_UTF8
      data = IO.read(path)
      File.open(path, "w") do |out|
        out.write(data[3..-1])
      end
    end
  end

このEF, BB, BFの並びはUTF-8のみで、UTF-16ではエンディアンによってFF, FE、あるいは、FE, FFになるとのことなんだけど、今回はUTF-8の対応だけにした。
というのも、UTF-16のときにBOMを削除してしまうと再読み込み時にエディタによっては問題になる場合がありそうな気がしたから。そこんとこ、どうなんでしょう。


編集