在Ruby 1.8.7中将具有二进制数据的YAML响应转换为UTF-8

时间:2011-03-11 19:53:04

标签: ruby utf-8 yaml

我正在从API获取响应并接收:

      response: 
        job: 
          unit_count: "1"
          slug: Answers
          lc_tgt: ja
          body_tgt: !binary |
            5Zue562U

          lc_src: en
          body_src: Answers
          job_id: "1948888"
      opstat: ok

那个body_tgt值应该是几个日文字符(回答),但它们正在转换为安全运送。我在1.8.7,所以我不能强制编码。有没有办法解包()他们?

1 个答案:

答案 0 :(得分:4)

这似乎是一个YAML文档,而不是JSON,使用YAML的二进制数据语言(后者又使用base64编码)。

Ruby内置的YAML解析库应该能够为您解析数据:

> x = YAML.load('      response: 
        job: 
          unit_count: "1"
          slug: Answers
          lc_tgt: ja
          body_tgt: !binary |
            5Zue562U

          lc_src: en
          body_src: Answers
          job_id: "1948888"
      opstat: ok')
 => {"opstat"=>"ok", "response"=>{"job"=>{"slug"=>"Answers", 
"unit_count"=>"1", "lc_tgt"=>"ja", "lc_src"=>"en", "body_tgt"=>"回答",
"job_id"=>"1948888", "body_src"=>"Answers"}}}

为了生成直接嵌入UTF-8的YAML,而不是作为二进制对象进行转义,您可以使用ya2yaml,“又一个to_yaml”实现,它可以生成编码为UTF-8的输出。安装ya2yaml gem,然后将其调用为:

> require 'ya2yaml'
> x.ya2yaml(:syck_compatible => true)