Насколько мне известно, лучшего способа использовать нет. Тем не менее, могу ли я предложить небольшое изменение?
Вместо того, чтобы изменять кодировку ввода, почему бы не изменить кодировку регулярного выражения? Переводить одну строку регулярного выражения каждый раз, когда вы встречаете новую кодировку, гораздо меньше, чем переводить сотни или тысячи строк ввода для соответствия кодировке вашего регулярного выражения.
# Utility function to make transcoding the regex simpler.
def get_regex(pattern, encoding='ASCII', options=0)
Regexp.new(pattern.encode(encoding),options)
end
# Inside code looping through lines of input.
# The variables 'regex' and 'line_encoding' should be initialized previously, to
# persist across loops.
if line.methods.include?(:encoding) # Ruby 1.8 compatibility
if line.encoding != last_encoding
regex = get_regex('<p>(.*)<\/p>',line.encoding,16) # //u = 00010000 option bit set = 16
last_encoding = line.encoding
end
end
line.match(regex)
В патологическом случае (когда входная кодировка меняет каждую строку) это будет так же медленно, так как вы повторно кодируете регулярное выражение каждый раз в цикле. Но в 99,9% случаев, когда кодировка является постоянной для всего файла из сотен или тысяч строк, это приведет к значительному сокращению повторного кодирования.