5

我正在尝试使用JSON.parse. 但是在一台机器上,使用json/ext,它会返回不正确的值。例如,\u2030应该E2 80 B0以 UTF-8 返回,但我得到的是01 00 00. "\\u2030"它会因转义或未转义而失败"\u2030"

1.9.2p180 :001 > require 'json/ext'
 => true 
1.9.2p180 :002 > s = JSON.parse '{"f":"\\u2030"}'
 => {"f"=>"\u0001\u0000\u0000"} 
1.9.2p180 :003 > s["f"].encoding
 => #<Encoding:UTF-8> 
1.9.2p180 :004 > s["f"].valid_encoding?
 => true 
1.9.2p180 :005 > s["f"].bytes.map do |x| x; end
 => [1, 0, 0] 

它可以在我的另一台机器上使用相同版本的 ruby​​ 和类似的环境变量。两台机器上的 Gemfile.lock 是相同的,包括json (= 1.6.3). 它确实适用json/pure于两台机器。

1.9.2p180 :001 > require 'json/pure'
 => true 
1.9.2p180 :002 > s = JSON.parse '{"f":"\\u2030"}'
 => {"f"=>"‰"} 
1.9.2p180 :003 > s["f"].encoding
 => #<Encoding:UTF-8> 
1.9.2p180 :004 > s["f"].valid_encoding?
 => true
1.9.2p180 :005 > s["f"].bytes.map do |x| x; end
 => [226, 128, 176] 

那么我的环境或设置中是否还有其他可能导致它解析不正确的东西?

4

2 回答 2

5

最近遇到了同样的问题,我追查到这个 Ruby 错误是由于在 Ruby 1.9.2中声明这个缓冲区以及它是如何被 GCC 优化的它已在此提交中修复。

您可以重新编译 Ruby-O0或使用更新版本的 Ruby(1.9.3 或更高版本)来修复它。

于 2014-10-29T22:09:41.470 回答
1

尝试升级您的 JSON Gem(至少到 1.6.6)或最新的 1.7.1。

于 2012-05-07T23:21:56.887 回答