2010-10-01 99 views
2

我使用紅寶石的這一點點:文件編碼在ruby中生成空白字符 - 爲什麼?

File.open(ARGV[0], "r").each_line do |line| 
    puts "encoding: #{line.encoding}" 
    line.chomp.split(//).each do |char| 
    puts "[#{char}]" 
    end 
end 

而且我有我餵養文件中的示例文件只包含三個時期和一個換行符。

當我使用UTF-8的fileencoding此文件(VIM:set fileencoding=utf-8),並在其上運行此腳本,我得到這樣的輸出:

encoding: UTF-8 
[] 
[.] 
[.] 
[.] 

然後,如果我改變fileencoding爲latin1(在vim:set fileencoding=latin1),然後運行該腳本,我沒有得到第一空白字符:

encoding: UTF-8 
[.] 
[.] 
[.] 

這是怎麼回事?據我所知,utf8編碼在文件的開頭放置了一些字節,以便將文件標記爲utf8編碼,但我認爲在處理文本時它們應該是不可見的(即:ruby運行時應該處理它們)。我錯過了什麼?

BTW:

ubuntu:~$ ruby --version 
ruby 1.9.2p0 (2010-08-18 revision 29034) [i686-linux] 

謝謝!

更新:有多餘的字符(物料清單)的文件

十六進制轉儲:

ubuntu:~$ hexdump new.board 
0000000 bbef 2ebf 2e2e 0a0d 0a0d 
000000a 

回答

1

嘗試運行

data = IO.read(ARGV[0]) 
puts data.dump 

,看看你會得到什麼。這將打印任何非打印字符的轉義碼。

它看起來並不像UTF8 byte order mark,如果我在vim使用:set bomb在文件中設置BOM和嘗試你的代碼中,我得到

[?] 
[?] 
[?] 
[.] 
[.] 
[.] 

dump給我

"\357\273\277...\n" 

這將是BOM的八進制表示(EF BB BF,十六進制)

+0

在vim中以utf8文件編碼保存的文件具有「\ u {feff}在data.dump輸出開始時,latin1文件沒有任何內容。 – 2010-10-01 06:34:49

+0

因此,這將建議我認爲,無論磁盤上的內容是什麼,ruby都將文件視爲utf8,並且不正確地處理BOM? (即:將其視爲字符,而不是編碼提示) – 2010-10-01 06:36:18

+0

@Stewart - 這是utf-16 BOM,我不知道爲什麼會出現這種情況。 – 2010-10-01 06:36:49