/ / Ruby JSON.parse връща неточни данни за unicode - руби, json

Ruby JSON.parse връща неточни данни за unicode - ruby, json

Опитвам се да анализирам някои 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"=>"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]

Той работи на другата ми машина със същата версия на руби и подобни променливи на средата. 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]

Така че има ли нещо друго в моята среда или настройка, което би могло да причини това да се анализира неправилно?

Отговори:

5 за отговор № 1

Наскоро се сблъсках със същия проблем и го проследих тази грешка на Ruby причинени от декларирането на този буфер в Ruby 1.9.2 и как става това оптимизиран от GCC, Той е фиксиран в този ангажимент.

Можете да компилирате Ruby с -O0 или използвайте по-нова версия на Ruby (1.9.3 или по-нова версия), за да го коригирате.


1 за отговор № 2

Опитайте да надстроите своя JSON Gem (най-малко до 1.6.6) или най-новият 1.7.1.