Руби не избегает окта на путах
У меня есть скрипт, который анализирует большой текстовый файл, извлекает определенные значения (используя line.split) и сохраняет их в текстовом файле. У меня проблемы с восьмеричными значениями, которые не интерпретируются при их сохранении в файл.
Когда я вручную указываю string
из oct
символы, это отлично работает:
test = "\320\232\320\250\320\220"
puts test
Однако, если я получу строку выше, используя title = line.split('=')[1]
, строковое значение идентично, но когда я пытаюсь puts
просто перезаписывает всю строку (включая кавычки)
Что я делаю неправильно?
2 ответа
@xaxxon объяснил, почему ваши восьмеричные коды не преобразуются, когда вы читаете строку из файла, а не представляете их как рубиновые литералы. Вот простой метод, который преобразует восьмеричные \xxx подстроки кодирования в соответствующий символ ascii.
def octal_convert(s)
s.gsub(/\\(?:\\|[0-7]{3})/) do |capture|
capture == "\\\\" ?
"\\" :
capture[1,3].to_i(8).chr
end
end
test = 'ab\\\\cd\320\232\320\250\320\220'
=> "ab\\\\cd\\320\\232\\320\\250\\320\\220"
octal_convert(test)
=> "ab\\cd\xD0\x9A\xD0\xA8\xD0\x90"
Когда в исходном коде ruby встречается литеральная строка, интерпретатор ruby просматривает строку и выполняет определенные экранирования, такие как восьмеричное значение, которое вы указали. То же самое, если вы поместите новую строку в строку с "\n".
Однако когда вы читаете данные из файла, такая интерполяция не происходит. Если вы хотите это сделать, вам придется выполнить логику для поиска и изменения значений самостоятельно с помощью поиска строк или регулярных выражений.
В идеале в файле, который вы читаете, не было бы восьмеричного текста, он просто имел бы фактическое значение прямо в файле. Это избавит от необходимости довольно сложного разбора текста и позволит вам читать файл так, как вы ожидаете.