逃避红宝石中的特殊字符

时间:2012-05-13 23:41:09

标签: ruby postgresql character-encoding

这是一个常见问题,但似乎无法在不诉诸不可靠的正则表达式的情况下找到答案。

基本上如果字符串中有\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

2 个答案:

答案 0 :(得分:2)

你提到你正在使用PL / ruby​​。这表明您的字符串实际上是使用old "escape" formatbytea值(BLOB的PostgreSQL版本)。转义格式使用前导\对八进制中的非ASCII值进行编码,因此gsubArray#pack会对您进行排序:

bytes = s.gsub(/\\([0-8]{3})/) { [ $1.to_i(8) ].pack('C') }

这会将s中的转义值扩展为原始字节,并将它们保留在bytes中。你仍在处理二进制数据,所以只是试图在控制台上显示它不一定会做任何有用的事情。如果你知道你正在处理可理解的字符串,那么你将不得不弄清楚它们所处的编码,并使用String方法来整理编码。

答案 1 :(得分:1)

也许您只想使用.to_s