Преобразование шаблона gsub() из ruby 1.8 в 2.0
У меня есть программа ruby, которую я пытаюсь обновить с ruby 1.8 до ruby 2.0.0-p247.
Это прекрасно работает в 1.8.7:
begin
ARGF.each do |line|
# a collection of pecluliarlities, appended as they appear in data
line.gsub!("\x92", "'")
line.gsub!("\x96", "-")
puts line
end
rescue => e
$stderr << "exception on line #{$.}:\n"
$stderr << "#{e.message}:\n"
$stderr << @line
end
Но в ruby 2.0 это приводит к исключению, когда встречаются 96 или 92, закодированные в файл данных, который в противном случае содержит то, что выглядит как ASCII:
invalid byte sequence in UTF-8
Я перепробовал все способы: двойную обратную косую черту, использование объекта регулярных выражений вместо строки, force_encoding() и т. Д., И я в тупике.
Кто-нибудь может заполнить недостающую часть головоломки для меня?
Благодарю.
=============== Дополнения: 2013-09-25 ============
Изменение \x92 на \u2019 не решило проблему.
Программа не выдает ошибку, пока на самом деле не достигнет 92 или 96 во входном файле, поэтому я запутался в том, как проблема с символьным шаблоном в строке, когда есть сотни тысяч строк входных данных, которые сопоставляются шаблоны без инцидентов.
1 ответ
Исключение вызывает не регулярное выражение, а компилятор Ruby. \x92
а также \x96
как бы вы представляли ’
а также –
в кодировке windows-1252, но Ruby ожидает, что строка будет в кодировке UTF-8. Вам нужно избавиться от привычки выставлять необработанные байтовые значения, такие как \x92
в ваших строковых литералах. Не-ASCII символы должны быть определены escape-последовательностями Unicode (в этом случае \u2019
а также \u2013
).
Теперь это мир Юникода, перестаньте думать о тексте в терминах байтов и вместо этого думайте в терминах символов.