2012-04-19 21 views
5

Tôi đang cố gắng phân tích cú pháp một số JSON chứa ký tự unicode thoát bằng cách sử dụng JSON.parse. Nhưng trên một máy, sử dụng json/ext, nó trả về giá trị không chính xác. Ví dụ: \u2030 phải trả lại E2 80 B0 bằng UTF-8, nhưng thay vào đó tôi nhận được 01 00 00. Nó không thành công với số "\\u2030" hoặc sốchưa thoát.Ruby JSON.parse trả về dữ liệu không chính xác cho 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] 

Nó hoạt động trên máy khác của tôi với cùng một phiên bản của các biến môi trường tương tự và ruby. Gemfile.lock trên cả hai máy giống hệt nhau, bao gồm json (= 1.6.3). Nó hoạt động với json/pure trên cả hai máy.

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] 

Vì vậy, có điều gì khác trong môi trường hoặc thiết lập có thể khiến cho phân tích cú pháp không chính xác?

+0

Mẹo: 's [" f "]. Bytes.to_a' – Phrogz

+0

'' foo'.encoding' trên máy không thành công là gì? Bạn có nhận xét mã hóa ở đầu mã nguồn của mình không? – Phrogz

+0

''foo'.encoding' là' # 'trên cả hai máy. Tôi cũng đã sao chép vấn đề với đầu vào là ASCII-8BIT. Tôi nghĩ nó không quan trọng lắm, vì phiên bản thoát của đầu vào là tất cả ASCII 7 bit. – bklimt

Trả lời

1

Thử nâng cấp Đá quý JSON của bạn (ít nhất là 1.6.6) hoặc mới nhất 1.7.1.

5

Gần đây đã gặp sự cố tương tự này và tôi đã theo dõi nó xuống this Ruby bug do khai báo this buffer trong Ruby 1.9.2 và cách nó được optimized by GCC. Nó được sửa trong this commit.

Bạn có thể biên dịch lại Ruby bằng -O0 hoặc sử dụng phiên bản mới hơn của Ruby (1.9.3 hoặc cao hơn) để khắc phục.

Các vấn đề liên quan