2010-07-11 14 views
86

मैं पढ़ रहा हूँ और एक अमेज़न एक्सएमएल फ़ाइल को पार्स करने और जब तक एक्सएमएल फ़ाइल से पता चलता है एक ', जब मैं इसे प्रिंट करने की कोशिश मैं निम्नलिखित त्रुटि मिलती है:पायथन यूनिकोड एनकोड त्रुटि

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128) 

मैं क्या है से इस प्रकार ऑनलाइन पढ़ा गया है, त्रुटि इस तथ्य से आ रही है कि एक्सएमएल फाइल यूटीएफ -8 में है, लेकिन पायथन इसे एएससीआईआई एन्कोडेड कैरेक्टर के रूप में संभालना चाहता है। क्या त्रुटि को दूर करने का कोई आसान तरीका है और क्या मेरा प्रोग्राम XML को प्रिंट करता है जैसा कि यह पढ़ता है?

+0

मैं इस सवाल को पोस्ट करने के लिए बस इतना ही आ रहा था। क्या 'यूनिकोड()' के लिए स्ट्रिंग को स्वच्छ करने का कोई आसान तरीका है? –

+0

कृपया यह भी देखें [यह] (http://stackoverflow.com/questions/3224427/python-sanitize-a-string-for-unicode/3224890#3224890) संबंधित प्रश्न का उत्तर दें: "पायथन यूनिकोडडेकोड एरर - क्या मैं एन्कोड गलत समझ रहा हूं ? " – tzot

उत्तर

163

संभावना है कि आपकी समस्या यह है कि आपने इसे ठीक से विश्लेषण किया है, और अब आप एक्सएमएल की सामग्री प्रिंट करने की कोशिश कर रहे हैं और आप ऐसा नहीं कर सकते क्योंकि कुछ विदेशी यूनिकोड वर्ण हैं। पहले ascii के रूप में अपने यूनिकोड स्ट्रिंग एन्कोड करने के लिए प्रयास करें:

unicodeData.encode('ascii', 'ignore') 

'उपेक्षा' भाग यह बताना सिर्फ उन पात्रों को छोड़ने के लिए होगा। अजगर डॉक्स से: http://www.joelonsoftware.com/articles/Unicode.html, जो मैं क्या हो रहा है पर एक बुनियादी ट्यूटोरियल के रूप में बहुत उपयोगी पाया:

>>> u = unichr(40960) + u'abcd' + unichr(1972) 
>>> u.encode('utf-8') 
'\xea\x80\x80abcd\xde\xb4' 
>>> u.encode('ascii') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128) 
>>> u.encode('ascii', 'ignore') 
'abcd' 
>>> u.encode('ascii', 'replace') 
'?abcd?' 
>>> u.encode('ascii', 'xmlcharrefreplace') 
'&#40960;abcd&#1972;' 

आप इस लेख को पढ़ने के लिए चाहते हो सकता है। पढ़ने के बाद, आप महसूस करना बंद कर देंगे जैसे आप अनुमान लगा रहे हैं कि किस आदेश का उपयोग करना है (या कम से कम यह मेरे साथ हुआ)।

+1

मैं निम्नलिखित स्ट्रिंग को सुरक्षित बनाने की कोशिश कर रहा हूं:' foo" बार बार "df '(नोट घुंघराले उद्धरण), लेकिन उपर्युक्त अभी भी मेरे लिए विफल रहता है। –

+0

@Rosarch: कैसे विफल रहता है? एक ही त्रुटि? और आपने किस त्रुटि-संचालन नियम का उपयोग किया था? –

+0

@Rosarch, आपकी समस्या शायद पहले है। इस कोड का प्रयास करें: # - * - कोडिंग: लैटिन -1 - * - यू = यू 'foo "बार बार" df' प्रिंट u.encode ('ascii', 'उपेक्षा') आप के लिए, यह शायद आपकी स्ट्रिंग INTO यूनिकोड को परिवर्तित कर रहा था जिसे आपने पाइथन स्क्रीप के लिए निर्दिष्ट एन्कोडिंग दिया था जो त्रुटि को फेंक दिया था। –

0

आप प्रपत्र

s.decode('utf-8') 

जो एक UTF-8 एक अजगर यूनिकोड स्ट्रिंग में bytestring एन्कोडेड में परिवर्तित कर देंगे के बारे में कुछ कर सकते हैं। लेकिन उपयोग करने की सटीक प्रक्रिया इस बात पर निर्भर करती है कि आप XML फ़ाइल को कैसे लोड और पार्स करते हैं, उदा। यदि आप कभी भी XML स्ट्रिंग को सीधे एक्सेस नहीं करते हैं, तो आपको codecs module से एक डिकोडर ऑब्जेक्ट का उपयोग करना पड़ सकता है।

+0

यह पहले से ही में UTF-8 त्रुटि एन्कोड किया विशेष रूप से है: myStrings = Deque ([u'Dorf और स्वोबोदा \ u2019s पाठ str पर बनाता है ... और कंप्यूटर इंजीनियरिंग \ u2019s subdisciplines '।]) स्ट्रिंग यूटीएफ -8 में है जैसा कि आप देख सकते हैं, लेकिन यह आंतरिक '\ u2019' –

+0

ओह, ठीक है, मैंने सोचा कि आपको एक अलग समस्या है। –

+7

@ एलेक्स बी: नहीं, स्ट्रिंग यूनिकोड है, यूटीएफ -8 नहीं। ** ** को एन्कोड करने के लिए ** इसे यूटीएफ -8 का उपयोग करें '' ... '। एनकोड (' utf-8 ') ' – sth

13

एक बेहतर समाधान:

if type(value) == str: 
    # Ignore errors even if the string is not proper UTF-8 or has 
    # broken marker bytes. 
    # Python built-in function unicode() can do this. 
    value = unicode(value, "utf-8", errors="ignore") 
else: 
    # Assume the value object has proper __unicode__() method 
    value = unicode(value) 

आप के बारे में क्यों अधिक पढ़ने के लिए करना चाहते हैं:

http://docs.plone.org/manage/troubleshooting/unicode.html#id1

+3

यह ओपी के मुद्दे से मदद नहीं करता है: * "आप चरित्र को एन्कोड नहीं कर सकते \ '2019 '* *। 'u' \ u2019' पहले से ही यूनिकोड है। – jfs

3

अपनी स्क्रिप्ट के अंदर अपने पर्यावरण के वर्ण एन्कोडिंग को हार्डकोड मत करो; इसके बजाय यूनिकोड टेक्स्ट सीधे प्रिंट करें:

assert isinstance(text, unicode) # or str on Python 3 
print(text) 

यदि आपका आउटपुट किसी फ़ाइल (या पाइप) पर रीडायरेक्ट किया गया है; आप PYTHONIOENCODING envvar इस्तेमाल कर सकते हैं, वर्ण एन्कोडिंग निर्दिष्ट करने के लिए:

$ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8 

अन्यथा, python your_script.py उसी रूप में काम करना चाहिए - अपने स्थान सेटिंग्स (POSIX चेक पर पाठ एन्कोड करने के लिए उपयोग किया जाता है: LC_ALL, LC_CTYPE, LANG envvars - यदि आवश्यक हो तो LANG को utf-8 लोकेल पर सेट करें)।

To print Unicode on Windows, see this answer that shows how to print Unicode to Windows console, to a file, or using IDLE

0

मैंने उपद्रव गैर-असीसी उद्धरण और कुछ उपयोग करने योग्य बल को बदलने के लिए निम्नलिखित लिखा है।

unicodeToAsciiMap = {u'\u2019':"'", u'\u2018':"`", } 

def unicodeToAscii(inStr): 
    try: 
     return str(inStr) 
    except: 
     pass 
    outStr = "" 
    for i in inStr: 
     try: 
      outStr = outStr + str(i) 
     except: 
      if unicodeToAsciiMap.has_key(i): 
       outStr = outStr + unicodeToAsciiMap[i] 
      else: 
       try: 
        print "unicodeToAscii: add to map:", i, repr(i), "(encoded as _)" 
       except: 
        print "unicodeToAscii: unknown code (encoded as _)", repr(i) 
       outStr = outStr + "_" 
    return outStr 
0

अपनी पायथन लिपि के शीर्ष पर निम्न पंक्ति जोड़ने का प्रयास करें।

# _*_ coding:utf-8 _*_ 
+0

सही वाक्यविन्यास है: '# - * - कोडिंग: utf-8 - * -' – azuax

1

बहुत बढ़िया पोस्ट:

: http://www.carlosble.com/2010/12/understanding-python-and-unicode/

# -*- coding: utf-8 -*- 

def __if_number_get_string(number): 
    converted_str = number 
    if isinstance(number, int) or \ 
      isinstance(number, float): 
     converted_str = str(number) 
    return converted_str 


def get_unicode(strOrUnicode, encoding='utf-8'): 
    strOrUnicode = __if_number_get_string(strOrUnicode) 
    if isinstance(strOrUnicode, unicode): 
     return strOrUnicode 
    return unicode(strOrUnicode, encoding, errors='ignore') 


def get_string(strOrUnicode, encoding='utf-8'): 
    strOrUnicode = __if_number_get_string(strOrUnicode) 
    if isinstance(strOrUnicode, unicode): 
     return strOrUnicode.encode(encoding) 
    return strOrUnicode 
0

आप न कि उन अमुद्रणीय वर्ण अनदेखी से, परदे के लिए स्ट्रिंग की एक अनुमानित प्रतिनिधित्व मुद्रित करने के लिए की जरूरत है, unidecode पैकेज यहाँ से प्रयास करें https://pypi.python.org/pypi/Unidecode

स्पष्टीकरण यहां पाया गया है:

https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/

इसमें दिए गए स्ट्रिंग u के लिए u.encode('ascii', 'ignore') का उपयोग करने से बेहतर है, और अनावश्यक सिर दर्द से आप को बचा सकता है, तो चरित्र सटीक नहीं है क्या आप के बाद कर रहे हैं, लेकिन अभी भी मानव पठनीयता करना चाहते हैं।

विरवान

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