在 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
产生相同的结果。