Непоследовательное чтение символов ввода-вывода при преобразовании кодировки

В 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 для подробностей.

Другие вопросы по тегам