用Ruby替换字符串中的字符

时间:2010-11-13 05:55:08

标签: ruby json escaping httparty posterous

给定以下格式的字符串(Posterous API以此格式返回帖子):

s="\\u003Cp\\u003E"

如何将其转换为实际的ascii字符,例如s="<p>"

在OSX上,我成功使用了Iconv.iconv('ascii', 'java', s)但是一旦部署到Heroku,我收到Iconv::IllegalSequence异常。我猜测Heroku部署的系统不支持java编码器。


我正在使用HTTParty向Posterous API发出请求。如果我使用curl发出相同的请求,那么我 not 得到双斜杠。

来自HTTParty github页面:

  

自动将JSON和XML解析为   ruby哈希基于响应   内容类型

Posterous API返回JSON(没有双斜线),HTTParty的JSON解析正在插入双斜杠。


以下是我使用HTTParty发出请求的方式的简单示例。

class Posterous
  include HTTParty
  base_uri "http://www.posterous.com/api/2"
  basic_auth "username", "password"
  format :json
  def get_posts
    response = Posterous.get("/users/me/sites/9876/posts&api_token=1234")
    # snip, see below...
  end
end

将明显的信息(用户名,密码,site_id,api_token)替换为有效值。

在剪辑时,response.body包含一个JSON格式的Ruby字符串,response.parsed_response包含一个Ruby散列对象,HTTParty通过解析来自Posterous API的JSON响应来创建。

在这两种情况下,\u003C等unicode序列都已更改为\\u003C

4 个答案:

答案 0 :(得分:3)

我找到了解决这个问题的方法。我跑过this gist。 elskwid有同样的问题,并通过JSON解析器运行字符串:

s = ::JSON.parse("\\u003Cp\\u003E")

现在,s = "<p>"

答案 1 :(得分:1)

前几天我遇到了这个问题。 HTTParty使用的json解析器中有一个错误(Crack gem) - 基本上它使用区分大小写的regexp用于Unicode序列,所以因为Posterous推出了A-F而不是a-f,所以Crack并没有取消它们。我提交了拉取请求以解决此问题。

在此期间,HTTParty很好地允许您指定备用解析器,以便您可以完全绕过Crack ::JSON.parse

class JsonParser < HTTParty::Parser
  def json
    ::JSON.parse(body)
  end
end

class Posterous
   include HTTParty
   parser ::JsonParser

   #....
end

答案 2 :(得分:1)

您还可以使用pack

"a\\u00e4\\u3042".gsub(/\\u(....)/){[$1.hex].pack("U")} # "aäあ"

或者做相反的事情:

"aäあ".gsub(/[^ -~\n]/){"\\u%04x"%$&.ord} # "a\\u00e4\\u3042"

答案 3 :(得分:0)

doubled-backslashes几乎看起来像是在调试器中查看的常规字符串。

字符串"\u003Cp\u003E"确实是"<p>",只有\u003C<的unicode,\003E>

>> "\u003Cp\u003E"  #=> "<p>"

如果你真正得到带有双反斜杠的字符串,那么你可以尝试剥离其中一个。

作为测试,请查看字符串的持续时间:

>> "\\u003Cp\\u003E".size #=> 13
>> "\u003Cp\u003E".size #=> 3
>> "<p>".size #=> 3

以上所有内容都是使用Ruby 1.9.2完成的,它具有Unicode感知功能。 v1.8.7不是。这是我使用1.8.7的IRB进行比较的结果:

>> "\u003Cp\u003E" #=> "u003Cpu003E"