Sto tentando di analizzare alcuni caratteri JSON con escape caratteri Unicode utilizzando. Ma su una macchina, usando json/ext
, restituisce valori errati. Ad esempio, \u2030
deve restituire E2 80 B0
in UTF-8, ma invece ho 01 00 00
. Fallisce con lo "\\u2030"
evaso o con lo "\u2030"
senza caratteri di escape.Ruby JSON.parse restituisce dati errati per unicode
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]
Funziona sulla mia altra macchina con la stessa versione di ruby e variabili di ambiente simili. Gemfile.lock su entrambe le macchine è identico, incluso json (= 1.6.3)
. Funziona con json/pure
su entrambe le macchine.
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]
Quindi c'è qualcos'altro nel mio ambiente o configurazione che potrebbe causarne l'analisi errata?
Suggerimento: 's [" f "]. Bytes.to_a' – Phrogz
Che cosa significa" foo'.encoding "sulla macchina che ha esito negativo? Hai un commento di codifica nella parte superiore del tuo codice sorgente? – Phrogz
''foo'.encoding' è' # 'su entrambe le macchine. Ho anche riprodotto il problema con l'input ASCII-8BIT. Penso che non dovrebbe importare molto, poiché la versione di escape dell'ingresso è tutto ASCII a 7 bit. –
bklimt