Рубиновая недопустимая байтовая последовательность в UTF-8
У меня есть следующий код, который дает мне недопустимую ошибку последовательности байтов, указывающую на метод сканирования в initialize
, Любые идеи о том, как это исправить? Для чего это стоит, ошибка не возникает, когда (.*)
между тегом h1 и закрытием >
не там.
#!/usr/bin/env ruby
class NewsParser
def initialize
Dir.glob("./**/index.htm") do |file|
@file = IO.read file
parsed = @file.scan(/<h1(.*)>(.*?)<\/h1>(.*)<!-- InstanceEndEditable -->/im)
self.write(parsed)
end
end
def write output
@contents = output
open('output.txt', 'a') do |f|
f << @contents[0][0]+"\n\n"+@contents[0][1]+"\n\n\n\n"
end
end
end
p = NewsParser.new
Редактировать: вот сообщение об ошибке:
news_parser.rb:10:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)
Решено: комбинация использования:@file = IO.read(file).force_encoding("ISO-8859-1").encode("utf-8", replace: nil)
а такжеencoding: UTF-8
решить вопрос.
Спасибо!
2 ответа
Сочетание использования: @file = IO.read(file).force_encoding("ISO-8859-1").encode("utf-8", replace: nil)
а также #encoding: UTF-8
решил проблему.
Хотя на этот вопрос уже есть принятый ответ, я нашел его, имея ту же проблему с другим стилем открытия файла:
File.open(file_name).each_with_index do |line, index|
line.gsub!(/[{}]/, "'")
puts "#{index} #{line}"
end
Я обнаружил, что мой входной файл был закодирован в ISO-8859-1, поэтому я изменил его на следующее, чтобы избежать ошибки:
File.open(file_name, 'r:ISO-8859-1:utf-8').each_with_index do |line, index|
line.gsub!(/[{}]/, "'")
puts "#{index} #{line}"
end
См. Документацию по дополнительному
mode
аргумент изFile.open
метод для более подробной информации.