文件编码在ruby中生成空白字符 - 为什么?

时间:2010-10-01 06:04:24

标签: ruby vim utf-8 file-encodings

我正在使用这一点红宝石:

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

1 个答案:

答案 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