Ruby JSON.parse为unicode返回不正确的数据

时间:2012-04-19 18:58:14

标签: ruby json

我尝试使用JSON.parse解析一些包含转义的unicode字符的JSON。但是在一台机器上,使用json/ext,它会返回不正确的值。例如,\u2030应返回UTF-8中的E2 80 B0,而是获得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] 

那么我的环境或设置中是否存在其他可能导致其错误解析的内容?

2 个答案:

答案 0 :(得分:5)

最近遇到了同样的问题,我将它追溯到this Ruby bug由Ruby 1.9.2中this buffer的声明以及它如何得到optimized by GCC引起的。它已在this commit中修复。

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

答案 1 :(得分:1)

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