Ich versuche, einige JSON-Dateien zu analysieren, die Unicode-Zeichen mit Escape-Zeichen enthalten JSON.parse
. Aber auf einer Maschine json/ext
gibt falsche Werte zurück. Zum Beispiel, u2030
sollte zurückkehren E2 80 B0
in utf-8, aber stattdessen bekomme ich 01 00 00
. Es schlägt entweder mit dem entflohenen fehl "\u2030"
oder das Unausgekapselte "u2030"
.
1.9.2p180 :001 > require "json/ext"
=> true
1.9.2p180 :002 > s = JSON.parse "{"f":"\u2030"}"
=> {"f"=>"u0001u0000u0000"}
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]
Es funktioniert auf meinem anderen Rechner mit derselben Version von Ruby und ähnlichen Umgebungsvariablen. Die Gemfile.lock auf beiden Maschinen ist identisch, einschließlich json (= 1.6.3)
. Es funktioniert mit json/pure
auf beiden Maschinen.
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]
Gibt es in meiner Umgebung etwas anderes, was dazu führen könnte, dass es falsch analysiert wird?
Antworten:
5 für die Antwort № 1Kürzlich stieß ich auf das gleiche Problem, und ich habe es aufgespürt dieser Ruby Bug verursacht durch die Erklärung von dieser Puffer in Ruby 1.9.2 und wie es geht von GCC optimiert. Es ist in behoben das begehen.
Sie können Ruby mit neu kompilieren -O0
oder verwenden Sie eine neuere Version von Ruby (1.9.3 oder höher), um das Problem zu beheben.
1 für die Antwort № 2
Aktualisieren Sie Ihren JSON-Edelstein (mindestens auf 1.6.6) oder den neuesten 1.7.1.