यूनिकोडडॉफ़ॉर्स, अमान्य निरंतरता बाइट


257

नीचे दी गई वस्तु क्यों विफल हो रही है? और यह "लैटिन -1" कोडेक के साथ सफल क्यों होता है?

o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving
v = o.decode("utf-8")

का परिणाम:

 Traceback (most recent call last):  
 File "<stdin>", line 1, in <module>  
 File "C:\Python27\lib\encodings\utf_8.py",
 line 16, in decode
     return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError:
 'utf8' codec can't decode byte 0xe9 in position 10: invalid continuation byte

जवाबों:


247

बाइनरी में, 0xE9 जैसा दिखता है 1110 1001। यदि आप यूटीएफ -8 के बारे में विकिपीडिया पर पढ़ते हैं , तो आप देखेंगे कि इस तरह के बाइट को फॉर्म के दो के बाद होना चाहिए 10xx xxxx। इसलिए, उदाहरण के लिए:

>>> b'\xe9\x80\x80'.decode('utf-8')
u'\u9000'

लेकिन यह सिर्फ अपवाद का यांत्रिक कारण है। इस मामले में, आपके पास एक स्ट्रिंग है जो लगभग निश्चित रूप से लैटिन में एन्कोडेड है। आप देख सकते हैं कि कैसे यूटीएफ -8 और लैटिन 1 अलग दिखते हैं:

>>> u'\xe9'.encode('utf-8')
b'\xc3\xa9'
>>> u'\xe9'.encode('latin-1')
b'\xe9'

(ध्यान दें, मैं यहां पायथन 2 और 3 प्रतिनिधित्व के मिश्रण का उपयोग कर रहा हूं। इनपुट पायथन के किसी भी संस्करण में मान्य है, लेकिन आपका पायथन दुभाषिया वास्तव में यूनिकोड और बाइट दोनों को इस तरह से दिखाने की संभावना नहीं है।)


2
धन्यवाद (और दूसरे ने उत्तर दिया), मैं गलत धारणा के तहत था कि 255 तक चार्ट सीधे रूपांतरित हो जाएगा।
रुईआरडीसी

मुझे प्रयोग करने में UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)त्रुटि मिलती है.encode(latin-1)
शिव

234

मैं एक ही त्रुटि थी जब मैंने पंडों read_csv विधि द्वारा एक सीएसवी फ़ाइल खोलने की कोशिश की।

समाधान एन्कोडिंग को 'लैटिन -1' में बदल रहा था:

pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')

1
क्या यह वास्तव में समस्या का समाधान करता है? क्या यह मूल रूप से सिर्फ पांडा को एक कम जटिल एन्कोडिंग शैली में अपग्रेड करके बाइट को अनदेखा करने के लिए नहीं कहता है?
यू चेन 14

61

यह UTF-8 अमान्य है। यह चरित्र आईएसओ-लैटिन 1 में ई-तीव्र चरित्र है, यही कारण है कि यह उस कोडसेट के साथ सफल होता है।

यदि आपको पता नहीं है कि जिस कोडसेट को आप तार में प्राप्त कर रहे हैं, आप थोड़ी परेशानी में हैं। यह सबसे अच्छा होगा यदि एक एकल कोडसेट (उम्मीद है कि UTF-8) को आपके प्रोटोकॉल / एप्लिकेशन के लिए चुना जाएगा और फिर आप उन लोगों को अस्वीकार कर देंगे जो डिकोड नहीं किए थे।

यदि आप ऐसा नहीं कर सकते हैं, तो आपको उत्तराधिकार की आवश्यकता होगी।


2
और उत्तराधिकारियों के लिए, चारडेट लाइब्रेरी देखें।
mlissner

44

क्योंकि UTF-8 मल्टीबाइट है और आपके \xe9स्थान के अलावा प्लस के संयोजन के अनुरूप कोई चार्ट नहीं है।

इसे utf-8 और latin-1 दोनों में सफल क्यों होना चाहिए ?

यहाँ utf-8 में एक ही वाक्य कैसे होना चाहिए:

>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'

लैटिन -1 एक एकल बाइट एन्कोडिंग परिवार है, इसलिए इसमें सब कुछ UTF-8 में परिभाषित किया जाना चाहिए। लेकिन कभी लैटिन -1 क्यों जीता?
रेहान_मं।

11

यदि यह त्रुटि तब उत्पन्न हुई जब किसी फ़ाइल को केवल खोला गया था, तो यह देखने के लिए जांचें कि क्या आपने इसे 'rb'मोड में खोला है


2
इस उत्तर के लिए धन्यवाद, की त्रुटि से बचने में सक्षम था, यूनिकोडडाउज़ररूट: 'utf-8' कोडेक 0xd7 को बाइट में नहीं पा सकता है 2024079: अमान्य कंटिन्यूशन बाइट द्वारा soup = BeautifulSoup(open('webpage.html', 'rb'), 'html.parser')
इसहाक फिलिप

6

यह मेरे साथ भी हुआ, जबकि मैं एक से हिब्रू युक्त पाठ पढ़ रहा था .txt फाइल ।

मैंने क्लिक किया: file -> save asऔर मैंने इस फाइल को UTF-8एन्कोडिंग के रूप में सहेजा


5

utf-8 कोड त्रुटि आमतौर पर तब आती है जब संख्यात्मक मानों की सीमा 0 से 127 से अधिक हो जाती है।

इस अपवाद को बढ़ाने का कारण है:

1) यदि कोड बिंदु <128 है, तो प्रत्येक बाइट कोड बिंदु के मूल्य के समान है। 2) यदि कोड बिंदु 128 या अधिक है, तो यूनिकोड स्ट्रिंग को इस एन्कोडिंग में नहीं दिखाया जा सकता है। (अजगर इस मामले में एक यूनिकोडेनाकोड अपवाद को जन्म देता है।)

इसे दूर करने के लिए हमारे पास एन्कोडिंग का एक सेट है, जिसका सबसे व्यापक रूप से उपयोग किया जाता है "लैटिन -1, जिसे आईएसओ-8859-1 भी कहा जाता है"

तो ISO-8859-1 यूनिकोड अंक 0–255 लैटिन -1 मानों के समान हैं, इसलिए इस एन्कोडिंग में परिवर्तित करने के लिए कोड बिंदुओं को बाइट मानों में परिवर्तित करने की आवश्यकता होती है; यदि 255 से बड़ा कोड बिंदु सामने आया है, तो स्ट्रिंग को लैटिन -1 में एन्कोड नहीं किया जा सकता है

जब यह अपवाद तब होता है जब आप डेटा सेट को लोड करने का प्रयास कर रहे हैं, तो इस प्रारूप का उपयोग करके देखें

df=pd.read_csv("top50.csv",encoding='ISO-8859-1')

सिंटैक्स के अंत में एन्कोडिंग तकनीक जोड़ें जो तब डेटा सेट को लोड करने के लिए स्वीकार करता है।


नमस्ते और एसओ में आपका स्वागत है! कृपया अपने उत्तर को यह सुनिश्चित करने के लिए संपादित करें कि यह इस प्रश्न में पहले से मौजूद अन्य उत्तरों में सुधार करता है।
hongsy


-1

इस मामले में, मैंने एक .py को निष्पादित करने का प्रयास किया जो एक पथ / फ़ाइल को सक्रिय करता है। एसक्यूएल।

मेरा समाधान फ़ाइल के कोडकरण को संशोधित करना था "BOM के बिना UTF-8" और यह काम करता है!

आप इसे नोटपैड ++ के साथ कर सकते हैं।

मैं अपने कोड का एक हिस्सा छोड़ दूंगा।

/ कोड /

con = psycopg2.connect (host = sys.argv [1], port = sys.argv [2], dbname = sys.argv [3], उपयोगकर्ता = sys.argv [4], पासवर्ड = sys.argv [5] )

कर्सर = con.cursor () sqlfile = खुला (पथ, 'r')

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.