2011-04-22 14 views
12

में ग़लत रूप से एन्कोडेड वर्ण को संभाल लें I python-lastfm लाइब्रेरी द्वारा लौटाए गए यूनिकोड स्ट्रिंग से निपट रहा हूं।पायथन यूनिकोड स्ट्रिंग

मुझे लगता है कि कहीं भी, पुस्तकालय एन्कोडिंग गलत हो जाता है और एक यूनिकोड स्ट्रिंग देता है जिसमें अमान्य वर्ण हो सकते हैं।

उदाहरण के लिए, मूल स्ट्रिंग मैं चर एक में उम्मीद कर रहा हूँ कि "Glück"

 
>>> a 
u'Gl\xfcck' 
>>> print a 
Traceback (most recent call last): 
    File "", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128) 

\ xfc भाग निकले मूल्य 252 है, जो "ü" की latin1 एन्कोडिंग से मेल खाती है है। किसी भी तरह से यह यूनिकोड स्ट्रिंग में एम्बेडेड हो जाता है जिस तरह से पाइथन अपने आप को संभाल नहीं सकता है।

मैं इसे एक सामान्य या यूनिकोड स्ट्रिंग को कैसे परिवर्तित करूं जिसमें मूल "ग्लूक" है? मैंने डीकोड/एन्कोड विधियों के साथ खेलने की कोशिश की, लेकिन या तो यूनिकोड एन्कोड एरर, या अनुक्रम \ xfc युक्त एक स्ट्रिंग मिला।

+0

पाइथन का कौन सा संस्करण आप उपयोग कर रहे हैं? –

+0

क्या ऑपरेटिंग सिस्टम? 'Sys.stdout.encoding' क्या है? –

+0

[वर्ग विशेषता के साथ सुंदर सूप खोज - यूनिकोड एन्कोड त्रुटि] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5746888/beautifulsoup-findall-with-class-attribute-unicode-encode-error) –

उत्तर

7

आपका यूनिकोड स्ट्रिंग ठीक है:

>>> unicodedata.name(u"\xfc") 
'LATIN SMALL LETTER U WITH DIAERESIS' 

समस्या आप इंटरैक्टिव प्रॉम्प्ट पर देखते हैं कि दुभाषिया क्या एन्कोडिंग उत्पादन करने के लिए अपने टर्मिनल के लिए स्ट्रिंग का उपयोग करना नहीं जानता है, तो यह करने के लिए वापस गिर जाता है "ascii" कोडेक - लेकिन वह कोडेक केवल जानता है कि ASCII वर्णों से कैसे निपटें।

>>> print u'Gl\xfcck' 
Glück 
+0

दरअसल, मैक और आधुनिक लिनक्स डेस्कटॉप डिफ़ॉल्ट रूप से यूटीएफ -8 कंसोल का उपयोग करते हैं, इसलिए यह बस काम करता है। दूसरी ओर, विंडोज कंसोल के लिए मानक सी लाइब्रेरी इंटरफ़ेस, कुछ हद तक लोकेल-विशिष्ट कोड पृष्ठों से फंस गया है, जिनमें से कोई भी यूटीएफ -8 नहीं है।विंडोज कंसोल पर गैर-ASCII वर्ण हमेशा एक परीक्षण होते हैं। – bobince

+0

@ बॉबन्स: विंडोज कंसोल के लिए इस्तेमाल किए गए "लोकल-विशिष्ट कोडपेजों के मुट्ठी भर" का सबसे प्रचलित सीपी 850 है, जो अन्य लैटिन-आधारित लोगों की तरह यू-उमलॉट को सही तरीके से प्रदर्शित करने में काफी खुश है। यदि आप विंडोज कंसोल पर ummapped यूनिकोड वर्ण भेजते हैं, तो आपको ओएसआई संदेश ** ascii ** कोडेक के बारे में बात नहीं करता है। आप उदास हो 'यूनिकोड एन्कोड त्रुटि:' charmap 'कोडेक स्थिति 2 में \ u9876' अक्षर को एन्कोड नहीं कर सकता: चरित्र मानचित्र '... हम अभी भी नहीं जानते कि ओपी को यह त्रुटि क्यों मिली। –

12

आप अपने यूनिकोड स्ट्रिंग में कनवर्ट करने के लिए है - यह मेरे मशीन पर ठीक काम करता है (क्योंकि मेरे वातावरण चर सेटिंग्स की तरह कुछ तुम्हारा से अलग होने की संभावना है क्योंकि sys.stdout.encoding "UTF-8" मेरे लिए है) कुछ एन्कोडिंग उदाहरण का उपयोग कर एक मानक स्ट्रिंग utf-8:

some_unicode_string.encode('utf-8') 
कि से

अलावा: इस

BeautifulSoup findall with class attribute- unicode encode error

और कम से कम दस इतने पर अन्य संबंधित सवालों की एक शिकार है। पहले अनुसंधान करें।

0

str() मॉडल फ़ील्ड से जो मिला है उसे स्ट्रिंग करने के लिए डाला गया है, जब तक कि यह पहले से ही एक यूनिकोड स्ट्रिंग है। (ओह, मैंने पूरी तरह से याद किया है कि यह django से संबंधित नहीं है)

4

अपने कोड की शुरुआत में, आयात के बाद, इन 3 लाइनों को जोड़ें।

import sys # import sys package, if not already imported 
reload(sys) 
sys.setdefaultencoding('utf-8') 

यह आपके प्रोग्राम के दौरान सिस्टम डिफ़ॉल्ट एन्कोडिंग (एएससीआई) को ओवरराइड करेगा।

संपादित करें: आपको यह तब तक नहीं करना चाहिए जब तक आप परिणामों के बारे में सुनिश्चित न हों, नीचे टिप्पणी देखें। यह पोस्ट भी सहायक है: Dangers of sys.setdefaultencoding('utf-8')

+0

इसे कभी मत करो। http://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script –

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