Непоследовательное чтение символов ввода-вывода при преобразовании кодировки
В 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
дал те же результаты.
1 ответ
Такое поведение является ошибкой. Смотрите http://bugs.ruby-lang.org/issues/8516 для подробностей.