我正在使用这一点红宝石:
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的文件编码(在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]
谢谢!
更新
带有额外字符(BOM)的文件的十六进制转储:
ubuntu:~$ hexdump new.board
0000000 bbef 2ebf 2e2e 0a0d 0a0d
000000a
答案 0 :(得分: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
)