我正在从ruby中的文件中读取一个字符串。这个字符串中有转义序列,我想把它变成合适的字符。
例如,我可能有这样的字符串:
"this is a string\n"
文件中包含实际字符\
和n
,而不是换行符。
是否有内置函数来解码这些文字?或者我是否必须手动写一些东西?
请注意,我没有使用rails,文件数据不是json。
答案 0 :(得分:1)
如果这只是一个纯文本文件(例如,不是JSON,YAML或其他具有特定转义序列的数据格式),那么这些字符序列没有特殊含义。因此,如果你想在你的应用程序的上下文中给它们一个,你将不得不编写代码来自己完成。对于新行,具体来说,你可以这样做:
input.gsub!('\n', "\n")
答案 1 :(得分:1)
如果您对JSON格式支持的转义序列感到满意,可以执行以下操作:
require 'json'
def unescape(str)
JSON.parse("[\"#{str}\"]")[0]
end
p unescape("\\nline\\u0040") # "\nline@"
请注意,ruby JSON解析器不接受裸值,因此字符串需要包装在数组或对象中。
如果无法正确解析字符串,JSON解析器也会引发错误,因此您应该添加一些错误处理代码。
答案 2 :(得分:0)
您可以使用%q{}
%q {“这是一个字符串\ n”}
=> “\”这是一个字符串\ n \“”
这样它就会转义字符串字符。
有一个通用的分隔字符串和正则表达式引用语法类似于 Perl的。它看起来像%q {this}(单引号)或%Q {this} (双引号),和%w {这是单引号词列表}。您 %Q |可以| %Q(使用)%Q ^其他^分隔符,如果你愿意。
修改强> 由于我误解了这个问题,我认为你最好的选择,如果你不想依赖第三方库(比如JSON),就要用适当的值替换:
str.gsub(/(\ n)的+ /, “\ n” 个)
答案 3 :(得分:0)
我希望有更好的选择,但知道你可以通过Kernel#eval
实现这一目标很好:
literal_from_file = '"this is a string\n"'
puts literal_from_file # print the literal first
puts eval(literal_from_file) # and then print the interpreted string
将打印:
"this is a string\n"
this is a string