0

这是一个常见问题,但如果不求助于不可靠的正则表达式,似乎无法找到答案。

基本上,如果\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 占位符永远不会被解码为字符。

我将如何分配与中间命令产生的相同字符串?

红宝石版本:1.8.5

4

2 回答 2

2

您提到您正在使用 PL/ruby。这表明您的字符串实际上是使用旧的“转义”格式bytea的值(BLOB 的 PostgreSQL 版本)。转义格式以八进制对非 ASCII 值进行编码,并带有前导,因此应该对您进行排序:\gsubArray#pack

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

这会将转义值扩展s为原始字节并将它们保留在bytes. 不过,您仍在处理二进制数据,因此仅尝试在控制台上显示它不一定会做任何有用的事情。如果您知道您正在处理可理解的字符串,那么您将必须弄清楚它们的编码方式并使用String方法来整理编码。

于 2012-05-14T02:13:20.627 回答
1

也许您只是想.to_s改用?

于 2012-05-13T23:56:16.317 回答