Что касается вашего comment/актуальная проблема:
"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)
реа DS 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Ã"
Байт «\ xC3» не является допустимым символом UTF-8. Ваша проблема возникает в некотором роде, когда вы получаете это значение из исходного кода (или ваши предположения о том, как можно манипулировать строками Ruby). Чтобы получить помощь, вам нужно будет немного объяснить, что должно представлять это значение или как оно было прочитано в вашей программе. –
Откуда берется '\ xC3'? В UTF-8 это означает, что должен следовать второй байт (например, '\ xA4' для' ä'). – cremno
«ITZVû - это точная строка.Я работаю. – Vijay