ファイル冒頭に保存されているデータは、BOM(Byte Order Mark)ではないでしょうか。BOMが付いているなら、Unicodeファイルの仕様通りと言えると思います。
http://e-words.jp/w/BOM.html
バイナリエディタ等でコードをみるとはっきりすると思います。
▽2
●
うぃんど ●50ポイント ベストアンサー |
BOM有りのUTF-8ファイルを読み込んでいるものと思われます。
(ファイルの先頭にバイトオーダーの情報があるファイル)
元のデータを作成する側でBOM無し保存できるなら、
それに越したことはありません。
データ作成側での対応が無理で、ruby側で対処するならば、
BOM付きであることを明示してopenすると良いでしょう。
open(ファイル名, 'r:BOM|UTF-8')
BOMの有無が判らない場合は、
先頭の3バイトが以下であれば、削れば良いでしょう。
http://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF
0xEF 0xBB 0xBF
BOM(Byte Order Mark)ですね。
http://ruby.11.n6.nabble.com/ruby-dev-32979-BOM-of-UTF-td3519737.html
まつもと ゆきひろです
...
|つぎに現状でdon't care であるとして、それは仕様として(とりあえずの
|形であっても)固定されたものですか?
将来にわたって対応しないと断言するほどではないですが、対応す
る予定はありません。
と、昔の情報では、こんなことを書いています。
なので、こんな対応をしているのも見つかります。
http://stackoverflow.com/questions/5011504/is-there-a-way-to-remove-the-bom-from-a-utf-8-encoded-file
content.gsub!("\xEF\xBB\xBF".force_encoding("UTF-8"), '')
でも、最新のバージョンでは、対応されてるみたい。
http://doc.ruby-lang.org/ja/1.9.3/method/Kernel/m/open.html
エンコーディングの指定
ext_enc(外部エンコーディング)が指定されている場合、読み込まれた文字列にはこのエンコーディングが指定され、出力する文字列はそのエンコーディングに変換されます。
ext_encが'-bom'で終わる場合、その入力に含まれるBOMはあらかじめ削られます。また、BOMがあった場合、入力された文字列にはそのBOMに対応するエンコーディングが設定されます。
でも、ちょっと罠があるらしく...
http://smileruby.hatenablog.com/entry/20110221/1298298952
つーか、Encodingに-bomで終わるのなんてあたっけ?
で、こうなんだとか。
念のためこっち(Index of Classes & Methods in Ruby 1.9.3 (Ruby 1.9.3) )で確認したら…
『If ext_enc starts with ‘BOM|’,? 』ってなっている!!
ってことでコチラが正解
puts File.open("utf8.txt", "r:UTF-8"){ |fp| fp.read(6).dump } # => "\xEF\xBB\xBF20\t" puts File.open("utf8.txt", "r:BOM|UTF-8"){ |fp| fp.read(3).dump } # => "20\t" puts File.open("utf8n.txt", "r:BOM|UTF-8"){ |fp| fp.read(3).dump } # => "20\t"
http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-open
If ext_enc starts with ‘BOM|’, check whether the input has a BOM. If there is a BOM, strip it and set external encoding as what the BOM tells.