5

を使用して、エスケープされた Unicode 文字を含む JSON を解析しようとしていますJSON.parse。しかし、あるマシンで を使用するjson/extと、正しくない値が返されます。たとえば、UTF-8 で\u2030返されるはず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] 

同じバージョンのルビーと同様の環境変数を使用して、他のマシンで動作します。両方のマシンの 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 1.9.2でのこのバッファーの宣言とGCC による最適化方法によって引き起こされたこの Ruby バグまで追跡しました。このコミットで修正されました。

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 に答える