/ / Ruby JSON.parse gibt falsche Daten für Unicode - Ruby, Json zurück

Ruby JSON.parse gibt falsche Daten für Unicode zurück - ruby, json

Ich versuche, einige JSON-Dateien zu analysieren, die Unicode-Zeichen mit Escape-Zeichen enthalten JSON.parse. Aber auf einer Maschine json/extgibt 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 № 1

Kü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.