2

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

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
[]
[.]
[.]
[.]

然后,如果我将文件编码更改为 latin1(在 vim: 中set fileencoding=latin1)并运行脚本,我不会得到第一个空白字符:

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

这里发生了什么?我知道 utf8 编码在文件的开头放置了一些字节以将文件标记为 utf8 编码,但我认为在处理文本时它们应该是不可见的(即:ruby 运行时应该处理它们)。我错过了什么?

顺便提一句:

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
4

1 回答 1

1

尝试运行

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

看看你得到了什么。这将打印任何非打印字符的转义码。

它看起来不像 UTF8字节顺序标记,如果我在文件上使用 vim 设置 BOM:set bomb并尝试我得到的代码

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

虽然dump给了我

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

这将是 BOM 的八进制表示(EF BB BF十六进制)

于 2010-10-01T06:29:58.090 回答