Что касается вашего комментария/актуальной проблемы:
"ITZVÃ"
— это содержимое файла. Когда я прочитал файл .
z = File.open("x")
z.read(5)
Тогда вывод должен быть ITZV\xC3\x83
вместо этого я получаю ITZV\xC3
Это связано с тем, что в UTF-8 Ã
является многобайтовым символом, т. е. ваша строка состоит из 5 символов, но 6 байтов:
"ITZVÃ".chars #=> ["I", "T", "Z", "V", "Ã"]
"ITZVÃ".bytes #=> [ 73, 84, 90, 86, 195, 131]
z.read(5)
считывает 5 байтов из ваших файлов, возвращая таким образом неполную строку UTF-8:
require 'tempfile'
z = Tempfile.new('foo')
z << 'ITZVÃ'
z.rewind
z.read(5) #=> "ITZV\xC3"
Вместо этого вы должны прочитать 6 байтов:
z.rewind
z.read(6) #=> "ITZV\xC3\x83"
Обратите внимание, что read
всегда возвращает ASCII-8BIT. закодированные строки. Вы должны установить другую кодировку вручную:
z.rewind
z.read(6).force_encoding('utf-8') #=> "ITZVÃ"
person
Stefan
schedule
08.07.2015
\xC3
? В UTF-8 это означает, что должен следовать второй байт (например,\xA4
дляä
). - person cremno   schedule 07.07.2015sub
работает с/пропускает недопустимые последовательности байтов. - person Stefan   schedule 07.07.2015z = File.open("x"); z.read(5);
Тогда вывод должен бытьITZV\xC3\x83
вместо этого я получаюITZV\xC3
. @Stefan есть идеи о том, почему это происходит в ruby. - person Vijay   schedule 07.07.2015