Ruby(Rails)如何对字符串进行反转义 - 撤销Array.to_s

4

我已经在组合几个库进行编程,但遇到了一个问题:字符串被“双重转义”。

例如:修复后的示例

 > x = ['a']
 => ["a"] 
 > x.to_s
 => "[\"a\"]" 
 > 

然而,再次回到...
\"\[\\\"s\\\"\]\"

在处理http头时出现了这种情况。我有一个头部,它将是一个数组,但是http库正在对数组的to_s值进行自己的字符转义。

我找到的解决方法是自己将数组转换为字符串,然后“撤销”to_s。就像这样: formatted_value = value.to_s

if value.instance_of?(Array)
  formatted_value = formatted_value.gsub(/\\/,"") #remove backslash                                                 
  formatted_value = formatted_value.gsub(/"/,"")  #remove single quote
  formatted_value = formatted_value.gsub(/\[/,"") #remove [                                                                                                     
  formatted_value = formatted_value.gsub(/\]/,"") #remove ]   
end
value = formatted_value

我需要一种更好的方法来解决这个问题...(而不需要猴子补丁正在使用的gems)。 (是的,如果我的字符串实际包含那些字符串,它会中断。)

有什么建议吗?

**更新2 **

好吧。 在这个领域仍然存在问题,但现在我认为我已经找到了核心问题。 它在调用to_s后将数组序列化为json。 至少,看起来它正在复制我所看到的。

['a'].to_s.to_json

我正在调用一个gem中的方法,该方法返回to_s的结果,然后我正在对其进行to_json调用。


1
你的示例中使用 x.to_s 导致了你展示的格式不是正常行为。为什么一个字符串会被转换成一个数组?你是否覆盖了一些你没有在这里告诉我们的东西? - jdl
我认为你应该澄清你的问题,或者提供更多关于“双重转义”的示例。如果你想在一个双引号字符串中放置双引号,那么必须进行转义。 - Mladen Jablanović
我也同样感到困惑。我在irb中执行了你的示例,但完全没有得到你的结果(实际上并没有期望得到)。为什么字符串会自动转换为数组呢? - nzifnab
你使用的是哪个版本的Ruby?正如@jdl所提到的,x.to_s没有你描述的行为,无论是在Ruby 1.8.7、Ruby 1.9.2还是JRuby中。 - Sébastien Le Callonnec
谢谢大家,非常抱歉,示例中出现了复制粘贴错误--现在已经修复。 - John Hinnegan
1个回答

8
我根据您修改后的问题编辑了我的答案:
我仍然无法复制您的结果!
>> x = ['a']
=> ["a"]
>> x.to_s
=> "a"

但是当我将最后一次调用更改为这样:
>> x.inspect
=> "[\"a\"]"

我假设你正在做这件事情?

它并不是必须要转义值 - 本质上。 它会将字符串存储为:

%{["a"]}

或者可以这样说:

'["a"]'

无论如何,这应该可以将其还原成字符串:

>> x = ['a']
=> ["a"]
>> y = x.inspect
=> "[\"a\"]"
>> z = Array.class_eval(y)
=> ["a"]
>> x == z
=> true

我对使用class_eval的安全性持怀疑态度,要谨慎处理用户输入,因为它可能会产生意外的副作用(即代码注入攻击),除非你非常确定原始数据来自哪里或允许通过什么。


谢谢。我在问题的示例中肯定搞砸了。 - John Hinnegan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接