RubyでBOM付きファイル出力

間抜けながらはまったこと。

$KCODE="u"
lines = ["ほげ(X).","ほんげげ(X)."]
io = open("result.txt","w")
lines.each{|line|
  io.print(NKF.nkf("-W8 -w16L",line))
}
io.close

なんてやってて、SWI-Prologで読み込ませると怒られていた。「なんだよーUnicode(UTF-16 BOM)対応じゃないのかよー」と思ってたけど、自分が間抜けだった。うん、上のようにすると、各行にBOMが付いちゃうんだね。BOMは本来ファイル先頭の2Byteらしい。ということで、以下のようにするときちんとBOM付きファイルが出力されてめでたくSWI-Prologで読み込めました。

$KCODE="u"
lines = ["ほげ(X).","ほんげげ(X)."]
io = open("result.txt","w")
io.print("\xFF\xFE") #Little Endian BOM
lines.each{|line|
  io.print(NKF.nkf("-W8 -w16L0",line)) #BOM無しに
}
io.close

いや、間抜けだった。ほんとバイナリエディタを使うのは大事ですね。なお、Big EndianのBOMを出力するときは、"\xFE\xFF"をprintするとできます。