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

bkl*_*imt 5 ruby json

我正在尝试解析一些包含转义的unicode字符的JSON 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] 
Run Code Online (Sandbox Code Playgroud)

它可以在我的其他机器上使用相同版本的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] 
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*lat 5

最近遇到了同样的问题,我跟踪了这个由Ruby 1.9.2 中这个缓冲区的声明引起的Ruby bug以及它如何被GCC优化.它已在此提交中修复.

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


小智 1

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