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