2012-04-19 12 views
5

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?

+0

Suggerimento: 's [" f "]. Bytes.to_a' – Phrogz

+0

Che cosa significa" foo'.encoding "sulla macchina che ha esito negativo? Hai un commento di codifica nella parte superiore del tuo codice sorgente? – Phrogz

+0

''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

risposta

1

Prova ad aggiornare il tuo JSON Gem (almeno 1.6.6) o il più nuovo 1.7.1.

5

Recentemente si è imbattuto in questo stesso problema, e l'ho rintracciato a this Ruby bug causato dalla dichiarazione di this buffer in Ruby 1.9.2 e come ottiene optimized by GCC. È stato risolto in this commit.

È possibile ricompilare Ruby con -O0 o utilizzare una versione più recente di Ruby (1.9.3 o superiore) per risolverlo.

Problemi correlati