我有一个解析大文本文件的脚本,提取某些值(使用line.split),并将它们存储在文本文件中。我遇到的问题是八进制值在保存到文件时无法解释。
当我手动指定string
个oct
字符时,它可以正常工作:
test = "\320\232\320\250\320\220"
puts test
但是,如果我使用title = line.split('=')[1]
获取上面的字符串,则字符串值相同,但是当我尝试puts
时,它只是重新声明整个字符串(包括引号)
我做错了什么?
答案 0 :(得分:2)
@xaxxon已经解释了为什么在从文件中读取字符串而不是将它们显示为ruby文字时,不会转换八进制代码。这是一个简单的方法,它将八进制\ 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"
答案 1 :(得分:1)
当在ruby源代码中遇到文字字符串时,ruby解释器将查看字符串并执行某些转义,例如您指定的八进制。如果将换行符放在带有“\ n”的字符串中,也是一样。
但是,当您从文件中读取数据时,不会发生插值。如果你想这样做,你必须使用字符串搜索或正则表达式自己查找和更改值的逻辑。
理想情况下,您正在阅读的文件中不会包含八进制转义文本,它只会在文件中具有实际值。这将消除对一些相当复杂的文本解析的需要,并允许您按预期读取文件。