2

我有一个脚本,它解析一个大文本文件,提取某些值(使用 line.split),并将它们存储在一个文本文件中。我遇到八进制值在保存到文件时无法解释的问题。

当我手动指定字符时,它可以正常工作stringoct

test = "\320\232\320\250\320\220"

puts test

但是,如果我使用 得到上面的字符串title = line.split('=')[1],则字符串值是相同的,但是当我尝试使用 时puts,它只是重新声明整个字符串(包括引号)

我究竟做错了什么?

4

2 回答 2

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"
于 2013-05-04T22:58:40.503 回答
1

当在 ruby​​ 源代码中遇到文字字符串时,ruby 解释器将查看该字符串并执行某些转义,例如您指定的八进制。如果您在带有“\n”的字符串中添加换行符,同样的事情。

但是,当您从文件中读取数据时,不会发生插值。如果你想这样做,你必须自己使用字符串搜索或正则表达式来执行查找和更改值的逻辑。

理想情况下,您正在阅读的文件中不会包含八进制转义文本,它只会在文件中具有实际值。这将消除对一些相当复杂的文本解析的需要,并允许您按预期读取文件。

于 2013-05-04T07:44:26.793 回答