这是一个常见问题,但似乎无法在不诉诸不可靠的正则表达式的情况下找到答案。
基本上如果字符串中有\302\240
或类似的组合,我想用真实字符替换它。
我正在使用PLruby,因此警告。
obj = {"a"=>"some string with special chars"}
warn obj.inspect
NOTICE: {"Outputs"=>["a\302\240b"]} <- chars are escaped
warn "\302\240"
NOTICE: <-- there is a non breaking space here, like I want
warn "#{json.inspect}"
NOTICE: {"Outputs"=>["a\302\240"b]} <- chars are escaped
因此,当我使用字符串文字时可以对这些进行解码,但使用“#{x}”格式时,\ xxx占位符永远不会被解码为字符。
我如何分配与中间命令相同的字符串?
Ruby版本:1.8.5
答案 0 :(得分:2)
你提到你正在使用PL / ruby。这表明您的字符串实际上是使用old "escape" format的bytea
值(BLOB的PostgreSQL版本)。转义格式使用前导\
对八进制中的非ASCII值进行编码,因此gsub
和Array#pack
会对您进行排序:
bytes = s.gsub(/\\([0-8]{3})/) { [ $1.to_i(8) ].pack('C') }
这会将s
中的转义值扩展为原始字节,并将它们保留在bytes
中。你仍在处理二进制数据,所以只是试图在控制台上显示它不一定会做任何有用的事情。如果你知道你正在处理可理解的字符串,那么你将不得不弄清楚它们所处的编码,并使用String方法来整理编码。
答案 1 :(得分:1)
也许您只想使用.to_s
?