Ruby JSON.parse возвращает неверные данные для юникода

Я пытаюсь разобрать некоторый 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"=>"\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] 

Это работает на другой моей машине с той же версией ruby ​​и аналогичными переменными среды. 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
задан bklimt 19 April 2012 в 18:58
поделиться