0

在 Ruby 1.9.3-429 中,我试图解析具有各种编码的纯文本文件,这些编码最终将转换为 UTF-8 字符串。非 ascii 字符适用于编码为 UTF-8 的文件,但非 UTF-8 文件会出现问题。

简化示例:

File.open(file) do |io|
  io.set_encoding("#{charset.upcase}:#{Encoding::UTF_8}")
  line, char = "", nil

  until io.eof? || char == ?\n || char == ?\r
    char = io.readchar
    puts "Character #{char} has #{char.each_codepoint.count} codepoints"
    puts "SLICE FAIL" unless char == char.slice(0,1)

    line << char
  end
  line
end

这两个文件都只是一个áÁð适当编码的字符串。我已检查文件是否已通过正确编码$ file -i <file_name>

使用 UTF-8 文件,我返回:

Character á has 1 codepoints
Character Á has 1 codepoints
Character ð has 1 codepoints

使用 ISO-8859-1 文件:

Character á has 2 codepoints
SLICE FAIL
Character Á has 2 codepoints
SLICE FAIL
Character ð has 2 codepoints
SLICE FAIL

我解释这个的方式readchar是返回一个错误转换的编码,这导致切片返回不正确。

这种行为正确吗?还是我错误地指定了文件外部编码?我宁愿不重写这个过程,所以我希望我在某个地方犯了错误。我以这种方式解析文件是有原因的,但我认为这些与我的问题无关。将内部和外部编码指定为选项会File.open产生相同的结果。

4

1 回答 1

0

这种行为是一个错误。有关详细信息,请参阅http://bugs.ruby-lang.org/issues/8516

于 2013-06-12T17:19:12.673 回答