2012-10-21 11 views
24

हर बार जब मैं हैश को JSON स्ट्रिंग में परिवर्तित करने का प्रयास करता हूं तो मुझे Encoding::UndefinedConversionError - "\xC2" from ASCII-8BIT to UTF-8 मिल रहा है। मैं [.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ]) साथ की कोशिश की, .force_encoding साथ .encode चेनिंग, पीछे की ओर, पैरामीटर स्विचन लेकिन कुछ भी तो काम करने के लिए लग रहा था मैं इस तरह त्रुटि पकड़ा:एन्कोडिंग :: UndefinedConversionError

begin 
    menu.to_json 
rescue Encoding::UndefinedConversionError 
    puts $!.error_char.dump 
    p $!.error_char.encoding 
end 

कहाँ मेनू एक MySQL DB से सामग्री के साथ एक अगली कड़ी के dataset.to_hash है, utf8_general_ci

"\ xC2"

< #Encoding: ASCII-8bit>

एन्कोडिंग और इस लौटे

एन्कोडिंग कभी भी नहीं बदले, इससे कोई फर्क नहीं पड़ता कि .encode/.force_encoding मैं उपयोग करता हूं। मैंने भाग्य के बिना .gsub!(/\\\xC2/) स्ट्रिंग को प्रतिस्थापित करने का भी प्रयास किया है।

कोई भी विचार?

+1

1. क्या आपने इसे आजमाया? 'menu.force_encoding (" आईएसओ -885 9 -1 ")। एनकोड (" यूटीएफ -8 ")' 2. अपनी सभी .rb फ़ाइलों के शीर्ष पर "# एन्कोडिंग" utf-8'' स्ट्रिंग जोड़ें। 3 अपने पर्यावरण सेटिंग्स की जांच करें। आपके टर्मिनल में '$ LC_CTYPE' को प्रतिबिंबित करते हैं? – Kashyap

+0

क्या चरण 1 त्रुटि के साथ विफल हुआ? चरण 2 काम किया? चरण 3 के लिए, http://thegreyblog.blogspot.in/2012/02/ फिक्सिंग-मैक-ओएस-एक्स-लायंस-एसएसएच-यूटीएफ -8-मुद्दों.html इस लिंक में एनवी सेटिंग्स हैं जो आपके प्रोग्राम को इस समस्या से बचने के लिए चलाना चाहिए। – Kashyap

उत्तर

62
menu.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?') 

यह पूरी तरह से काम किया है, मैं कुछ अतिरिक्त वर्ण को बदलने के लिए था, लेकिन वहाँ कोई और अधिक त्रुटियाँ हैं।

+1

शानदार समाधान - SQL सर्वर में अजीब प्रकारों से निपटने में मेरी समस्या हल हो गई। धन्यवाद! –

+0

धन्यवाद। मुझे दस्तावेज़ों में डाइविंग के बिना जवाब ढूंढना पसंद है। –

+0

धन्यवाद! यह मेरे लिए भी काम करता है, भविष्य के संदर्भ के लिए आधिकारिक रूबी डॉक्टर [यहां] (http://www.ruby-doc.org/core-2.1.2/String.html#method-i-encode) – jmoreira

14

"\ xC2" के लिए आप क्या उम्मीद करते हैं? शायद एक Â

ASCII-8bit के साथ आप बाइनरी डेटा है, और गहरे लाल रंग का नहीं कर सकते निर्णय लेते हैं, क्या होना चाहिए।

आपको पहले एन्कोडिंग force_encoding के साथ सेट करना होगा।

Encoding.list.each{|enc| 
    begin 
    print "%-10s\t" % [enc] 
    print "\t\xC2".force_encoding(enc) 
    print "\t\xC2".force_encoding(enc).encode('utf-8') 
    rescue => err 
    print "\t#{err}" 
    end 
    print "\n" 
} 

परिणाम अपने "\ xC2" के लिए विभिन्न एन्कोडिंग में संभावित मान हैं:

आप नीचे दिए गए कोड की कोशिश कर सकते हैं।

परिणाम आपके आउटपुट प्रारूप पर निर्भर हो सकता है, लेकिन मुझे लगता है कि आप एक अच्छा अनुमान लगा सकते हैं, जो आपके पास एन्कोडिंग है।

जब आप एन्कोडिंग परिभाषित आप (शायद CP1251) आप

menu.force_encoding('cp1252').to_json 

भी टिप्पणी Kashyaps देखें कर सकते हैं की जरूरत है।

+0

यह वही है जो मैंने किया: 'एन्कोडिंग .list.each {| enc | प्रिंट "% -10s \ t"% [enc] प्रिंट मेनू .to_json.force_encoding (enc) प्रिंट मेनू.to_json.force_encoding (enc) .encode ('utf-8 ') बचाव => गलती प्रिंट "\ t # {अं}" अंत प्रिंट "\ n" } ' और यह है कि क्या मैं प्रत्येक परिणाम के लिए मिल गया है है: 'SJIS-केडीडीआई "\ xC2" ASCII-8BIT से UTF-8' – martriay

7

आप अजीब अक्षर के खोने के बारे में परवाह नहीं है, तो आप उन्हें दूर उड़ा सकते हैं:

str.force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '') 
+0

पर काम नहीं किया :( एन्कोडिंग :: अनिर्धारित रूपांतरण/ASCII-8BIT से UTF-8 – martriay

+3

मेनू.to_s.encode ('UTF-8', { : अमान्य =>: प्रतिस्थापित करें,: undef =>: प्रतिस्थापित करें,: प्रतिस्थापित करें => '?'}} -> यह काम किया! : डी – martriay

6

आपका स्वतः स्वीकार कर लिया समाधान काम नहीं करता है, वहाँ प्रभावी रूप से कोई त्रुटि नहीं है, लेकिन यह JSON नहीं है।

मैंने ओज मणि का उपयोग कर समस्या हल की, अब यह काम करता है। यह मानक JSON लाइब्रेरी से भी तेज है।

Writting:

menu_json = Oj.dump menu 

पढ़ना:

menu2 = Oj.load menu_json 

अधिक जानकारी के लिए https://github.com/ohler55/oj।मुझे उम्मीद है इससे मदद मिलेगी।

+0

समस्या त्रुटि थी , JSON भाग नहीं। इसलिए, मेरे स्वत: स्वीकृत उत्तर काम करता है। वैसे भी, मैं आपको वैकल्पिक समाधान देने के लिए उभारा दूंगा। – martriay

+0

ठीक है, मैं आपसे सहमत हूं, अब त्रुटियां नहीं हैं, लेकिन यह एक जेसन स्ट्रिंग नहीं है। मुझे नहीं पता कि आपका उद्देश्य क्या था, लेकिन मुझे अपने जेसन को वापस लोड करने की ज़रूरत थी, और मैं एक वैध JSON स्ट्रिंग चाहता था। या शायद मैंने आपके प्रस्तावित समाधान में कुछ याद किया है? – gvo

+0

यह प्रश्न केवल त्रुटि के बारे में था, मैं नहीं कह रहा हूं कि मेरा जवाब सबसे अच्छा विकल्प है, स्पष्ट रूप से यह आपके उद्देश्य के लिए नहीं है, लेकिन प्रस्तुत समस्या हल करता है: एन्कोडिंग त्रुटि। मेरे प्रश्न में जो JSON उल्लेख है वह संदर्भपरक उद्देश्यों के लिए है। – martriay

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