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

s="\\u003Cp\\u003E"

我如何将其转换为实际的ASCII字符,以便 s="<p>"?

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


我在用 httparty 向后API提出请求。如果我使用卷曲来提出相同的请求,那我会做 不是 获得双重斜线。

摘自httparty github页面:

根据响应内容类型将JSON和XML自动解析为Ruby Hashes

后代的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格式的红宝石字符串和 response.parsed_response 包含HTTPARTY创建的Ruby Hash对象,该对象通过从后API中解析JSON响应来创建。

在这两种情况下,Unicode序列,例如 \u003C 已更改为 \\u003C.

有帮助吗?

解决方案

前几天我遇到了这个确切的问题。 HTTPARTY使用的JSON解析器中有一个错误(Crack Gem) - 基本上,它对Unicode序列使用了对案例敏感的REGEXP,因此,由于Persterous将AF而不是AF放出,因此Crack并没有使它们毫无用处。我提交了一个拉动请求以解决此问题。

同时,httparty很好地允许您指定替代解析器,以便您可以执行 ::JSON.parse 完全绕过裂缝这样:

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

class Posterous
   include HTTParty
   parser ::JsonParser

   #....
end

其他提示

我找到了解决这个问题的解决方案。我遇到了 这个要点. 。埃尔斯克维德(Elskwid)遇到了相同的问题,并通过JSON解析器运行了字符串:

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

现在, s = "<p>".

您也可以使用 pack:

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

或进行反面:

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

双打倾斜几乎看起来像是在调试器中查看的常规弦。

字符串 "\u003Cp\u003E" 真的是 "<p>", , 只有 \u003C 是Unicode <\003E>.

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

如果您真正获得了双重斜线的弦,则可以尝试剥离其中一对。

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

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

以上所有内容都是使用Ruby 1.9.2完成的,该Ruby 1.9.2是Unicode意识到的。 v1.8.7不是。这是我使用1.8.7的IRB进行比较的方法:

>> "\u003Cp\u003E" #=> "u003Cpu003E"
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top