2012-03-07 18 views
10

मैं एक आने वाली बाइट स्ट्रिंग को परिवर्तित करने की कोशिश कर रहा हूं जिसमें वैध यूटीएफ -8 स्ट्रिंग में गैर-असीसी वर्ण शामिल हैं जैसे कि मैं डंप कर सकता हूं।पायथन बाइट स्ट्रिंग एन्कोड और डीकोड

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128) 

मेरी स्थिति, 'बी' में गूगल प्रोटोकॉल बफ़र्स के माध्यम से mysql से आ रही है और साथ बाहर भर जाता है:

b = '\x80' 
u8 = b.encode('utf-8') 
j = json.dumps(u8) 

मैं j '\ xC2 \ x80' होने का लेकिन इसके बजाय मैं उम्मीद कुछ ब्लॉब डेटा।

कोई विचार?

संपादित करें: मेरे पास ईथरनेट फ्रेम हैं जो एक ब्लॉब के रूप में एक MySQL तालिका में संग्रहीत हैं (कृपया, हर कोई, विषय पर रहें और चर्चा करें कि तालिका में पैकेट क्यों हैं)। टेबल collation utf-8 है और डीबी परत (sqlalchemy, non-orm) डेटा को पकड़ रहा है और structs (google प्रोटोकॉल बफर) बना रहा है जो ब्लॉब को पायथन 'str' के रूप में संग्रहीत करता है। कुछ मामलों में मैं सीधे किसी भी मुद्दे के साथ प्रोटोकॉल बफर का उपयोग करता हूं। अन्य मामलों में, मुझे जेसन के माध्यम से उसी डेटा का पर्दाफाश करने की आवश्यकता है। मैंने जो देखा वह यह है कि जब json.dumps() इसकी बात करता है, '\ x80' को अमान्य यूनिकोड char (\ ufffd iirc)

+0

आपको एक कोड स्निपेट देना होगा जो दिखाता है कि "किसी भी मुद्दे के बिना सीधे प्रोटोकॉल बफर का उपयोग करें" का अर्थ है। आपको 'json.dumps' उत्पादन \ ufffd बनाने के लिए प्रोटोकॉल बफर के साथ क्या करते हैं, कोड कोड स्निपेट के साथ दिखाना होगा। आपको मूल पैकेट को पुनर्प्राप्त करने के लिए इस JSONised पैकेट के उपभोक्ता को वास्तव में क्या कहना है, यह कहने की आवश्यकता है। –

उत्तर

6

यूनिकोड संस्करण प्राप्त करने के लिए b.decode('name of source encoding') का उपयोग करें। जब मैंने इसे सीखा तो यह आश्चर्यजनक था। उदाहरण:

In [123]: 'foo'.decode('latin-1') 
Out[123]: u'foo' 
+9

याद रखें: 'डीकोड' बाइट्स से यूनिकोड तक जाता है। 'एनकोड' यूनिकोड से बाइट्स तक जाता है। –

+0

@DanielRoseman हां, यही कारण है कि यह सवाल का जवाब है। – Marcin

+0

निश्चित रूप से, मैं बहस नहीं कर रहा था, बस ओपी के लिए कुछ अतिरिक्त स्पष्टीकरण प्रदान करता हूं। –

9

आपको उस सॉफ्टवेयर एपीआई के लिए प्रलेखन की जांच करने की आवश्यकता है जिसका आप उपयोग कर रहे हैं। बीएलओबी एक संक्षिप्त नाम है: बिनरी बड़ा ऑब्जेक्ट।

यदि आपका डेटा वास्तव में बाइनरी है, तो यूनिकोड को डीकोड करने का विचार निश्चित रूप से बकवास है।

यदि यह वास्तव में पाठ है, तो आपको यह जानने की आवश्यकता है कि यूनिकोड को डीकोड करने के लिए किस एन्कोडिंग का उपयोग करना है।

तो फिर तुम json.dumps(a_Python_object) का उपयोग करें ... यदि आप अपने आप को UTF-8 में यह सांकेतिक शब्दों में बदलना, json इसे वापस फिर से डिकोड देगा:

>>> import json 
>>> json.dumps(u"\u0100\u0404") 
'"\\u0100\\u0404"' 
>>> json.dumps(u"\u0100\u0404".encode('utf8')) 
'"\\u0100\\u0404"' 
>>> 

अद्यतन latin1 के बारे में:

u'\x80' एक बेकार व्यर्थ C1 नियंत्रण है चरित्र - एन्कोडिंग लैटिन -1 होने की बेहद असंभव है। लैटिन -1 "एक जाल और भ्रम" है - सभी 8-बिट बाइट यूनिकोड को अपवाद उठाए बिना डीकोड किए जाते हैं। "काम करता है" भ्रमित न करें और "अपवाद नहीं बढ़ाता"।

+0

दिलचस्प। मुझे लगता है कि मैं इसे सरल रख सकता हूं: प्रिंट json.dumps ('\ x80'.decode (' latin1 ')) –

+1

@ कुंग-फू: आपके पास कोई सबूत नहीं है कि' latin1' सही एन्कोडिंग है। –

+0

फिर utf-8 में बाइट्स की स्ट्रिंग एन्कोड करने की विधि क्या है? –

2

मुझे लगता है कि आप जो करने की कोशिश कर रहे हैं वह कुछ एन्कोडिंग की स्ट्रिंग ऑब्जेक्ट को डीकोड कर रहा है। क्या आप जानते हैं कि एन्कोडिंग क्या है? यूनिकोड ऑब्जेक्ट प्राप्त करने के लिए।

unicode_b = b.decode('some_encoding') 

और फिर एक स्ट्रिंग ऑब्जेक्ट पर utf_8 एन्कोडिंग का उपयोग करके यूनिकोड ऑब्जेक्ट को फिर से एन्कोड करना।

b = unicode_b.encode('utf_8') 

एक अनुवादक के रूप में यूनिकोड वस्तु का उपयोग करना, यह जानकर क्या स्ट्रिंग के मूल एन्कोडिंग मैं निश्चित रूप से कह नहीं कर सकता है बिना लेकिन वहाँ संभावना है कि रूपांतरण के रूप में उम्मीद नहीं जाना होगा है। यूनिकोड ऑब्जेक्ट का मतलब एक एन्कोडिंग के तारों को दूसरे में परिवर्तित करने के लिए नहीं है।मैं यूनिकोड ऑब्जेक्ट के साथ काम करता हूं, यह मानते हुए कि एन्कोडिंग क्या है, अगर आपको नहीं पता कि एन्कोडिंग क्या है तो वास्तव में परीक्षण और त्रुटि के बिना पता लगाने का कोई तरीका नहीं है, और फिर एन्कोडेड स्ट्रिंग में वापस कनवर्ट करें आप एक स्ट्रिंग ऑब्जेक्ट वापस चाहते हैं।

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