2011-05-25 12 views
5

में एन्कोड करने में विफल रहा है मेरे पास कुछ पायथन कोड है जो इसमें खराब यूनिकोड वाला स्ट्रिंग प्राप्त कर रहा है। जब मैं खराब वर्णों को अनदेखा करने का प्रयास करता हूं, तो पाइथन अभी भी चुटकुले (संस्करण 2.6.1)। यह इस प्रकार से पुन: पेश करने के लिए:पाइथन खराब यूनिकोड को एसीआईआई

s = 'ad\xc2-ven\xc2-ture' 
s.encode('utf8', 'ignore') 

यह

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

क्या मैं गलत कर रहा हूँ फेंकता है?

+2

क्या आप वाकई s.decode ('utf8', 'ignore') नहीं चाहते हैं? – Dan

+0

हाँ, आप सही हैं। ओह्स :) –

उत्तर

10

एक यूनिकोड उदाहरण के लिए एक स्ट्रिंग परिवर्तित पायथन 2.x में str.decode() है:

>>> s.decode("ascii", "ignore") 
u'ad-ven-ture' 
+1

ध्यान दें कि ASCII के बजाय ओपी के एन्कोडिंग (utf-8) के साथ आपको 'u'adventure' मिल जाएगा। मैं वास्तव में 'यूनिकोड (utf8_string,' utf-8 ',' अनदेखा ') पसंद करता हूं क्योंकि यह स्पष्ट है कि आप एक यूनिकोड स्ट्रिंग बना रहे हैं। –

+0

's.decode ('ascii', 'replace') भी है जिसका उपयोग मुद्दों के बारे में जानने के लिए किया जा सकता है। – Wernight

8

आप भ्रमित कर रहे हैं "यूनिकोड" और "utf-8"। आपकी स्ट्रिंग s यूनिकोड नहीं है; यह एक विशेष एन्कोडिंग (लेकिन यूटीएफ -8 नहीं, अधिक संभावना आईएसओ -885 9 -1 या ऐसा नहीं है।) unicode से डीकोडिंग डेटा एन्कोडिंग पर किया गया है। यूनिकोड से बाइटस्ट्रिंग तक जाकर एन्कोडिंग है। शायद आप s एक यूनिकोड स्ट्रिंग बनाने के लिए होती:

>>> s = u'ad\xc2-ven\xc2-ture' 
>>> s.encode('utf8', 'ignore') 
'ad\xc3\x82-ven\xc3\x82-ture' 

या शायद आप UTF-8 के रूप में bytestring इलाज लेकिन अवैध दृश्यों को अनदेखा करना चाहते, जिस स्थिति में आप होगा डिकोड 'के रूप में की अनदेखी' के साथ bytestring त्रुटि हैंडलर:

>>> s = 'ad\xc2-ven\xc2-ture' 
>>> u = s.decode('utf-8', 'ignore') 
>>> u 
u'adventure' 
>>> u.encode('utf-8') 
'adventure' 
संबंधित मुद्दे