Я пытаюсь разобрать некоторый 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]
Есть ли что-то еще в моей среде или настройках, что может привести к неправильному синтаксическому анализу?