2012-04-19 16 views
5

के लिए गलत डेटा लौटा रहा है। मैं कुछ JSON को JSON.parse का उपयोग करके बच निकले हुए यूनिकोड वर्णों को पार्स करने का प्रयास कर रहा हूं। लेकिन एक मशीन पर, json/ext का उपयोग करके, यह गलत मान देता है। उदाहरण के लिए, \u2030 को UTF-8 में E2 80 B0 वापस करना चाहिए, लेकिन इसके बजाय मुझे 01 00 00 मिल रहा है। यह या तो बच निकले "\\u2030" या अनदेखा "\u2030" से विफल रहता है।रूबी JSON.parse यूनिकोड

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] 

यह मेरी अन्य मशीन पर रूबी और इसी तरह के पर्यावरण चर के समान संस्करण के साथ काम करता है। दोनों मशीनों पर 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] 

तो क्या मेरे पर्यावरण या सेटअप में कुछ और है जो इसे गलत तरीके से पार्स कर सकता है?

+0

युक्ति: 's [" f "]। Bytes.to_a' – Phrogz

+0

विफल होने वाली मशीन पर 'foo'encoding'' क्या है? क्या आपके पास अपने स्रोत कोड के शीर्ष पर एक एन्कोडिंग टिप्पणी है? – Phrogz

+0

'foo'encoding'' मशीनों पर एन्कोडिंग: यूटीएफ -8> 'है। मैंने इनपुट के साथ समस्या को पुन: उत्पन्न किया है जो ASCII-8BIT है। मुझे लगता है कि इससे कोई फर्क नहीं पड़ता, क्योंकि इनपुट के बचने वाले संस्करण सभी 7-बिट ASCII हैं। – bklimt

उत्तर

1

अपने JSON Gem (कम से कम 1.6.6) या नवीनतम 1.7.1 को अपग्रेड करने का प्रयास करें।

5

हाल ही में इसी समस्या में भाग गया, और मैंने इसे this Ruby bug पर this buffer की घोषणा के कारण रूबी 1.9.2 में घोषित किया और यह optimized by GCC कैसे प्राप्त हुआ। यह this commit में तय है।

आप रूबी को -O0 के साथ पुन: संकलित कर सकते हैं या इसे ठीक करने के लिए रूबी (1.9.3 या बेहतर) के एक नए संस्करण का उपयोग कर सकते हैं।

संबंधित मुद्दे