Преобразование шаблона 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).

Теперь это мир Юникода, перестаньте думать о тексте в терминах байтов и вместо этого думайте в терминах символов.

Другие вопросы по тегам