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するとできます。