を使用して、エスケープされた 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]
私の環境またはセットアップに、正しく解析されない原因となる可能性があるものは他にありますか?