2012-07-01 11 views
14

मैंने आधिकारिक दस्तावेज़ों से HOWTO on Unicode पढ़ा है और एक पूर्ण, बहुत विस्तृत article भी पढ़ा है। फिर भी मुझे यह नहीं मिला कि यह मुझे यह त्रुटि क्यों फेंकता है।यूनिकोड एन्कोडर त्रुटि: 'ascii' कोडेक चरित्र को एन्कोड नहीं कर सकता [...]

यहां मैं कोशिश करता हूं: मैं एक एक्सएमएल फ़ाइल खोलता हूं जिसमें एएससीआईआई रेंज से बाहर वर्ण होते हैं (लेकिन एक्सएमएल रेंज के अंदर)। मैं cfg = codecs.open(filename, encoding='utf-8, mode='r') के साथ ऐसा करता हूं जो ठीक चलता है। repr() के साथ स्ट्रिंग को देखते हुए मुझे एक यूनिकोड स्ट्रिंग भी दिखाती है।

अब मैं आगे बढ़ता हूं और parseString(cfg.read().encode('utf-8') के साथ पढ़ता हूं। बेशक, मेरी एक्सएमएल फाइल इस से शुरू होती है: <?xml version="1.0" encoding="utf-8"?>। हालांकि मुझे लगता है कि यह प्रासंगिक नहीं है, मैंने अपनी पायथन लिपि के लिए utf-8 भी परिभाषित किया है, लेकिन चूंकि मैं इसमें सीधे यूनिकोड वर्ण नहीं लिख रहा हूं, यह यहां लागू नहीं होना चाहिए। निम्न पंक्ति के लिए समान: from __future__ import unicode_literals जो शुरुआत में भी सही है।

अगली बात मैं जेनरेट ऑब्जेक्ट को अपनी कक्षा में पास करता हूं जहां मैंने इस तरह के चर में टैग पढ़े: xmldata.getElementsByTagName(tagName)[0].firstChild.data और इसे मेरी कक्षा में एक चर के लिए असाइन करें।

अब पूरी तरह से क्या काम करता है उन आदेशों हैं (obj वर्ग का एक उदाहरण है):

for element in obj: 
    print element 

और इस आदेश के रूप में अच्छी तरह से काम करता है:

print obj.__repr__() 

मैं __iter__() परिभाषित बस हर उपज के लिए परिवर्तनीय जबकि __repr__() ठेठ प्रिंटफ सामग्री का उपयोग करता है: "%s" % self.varname

दोनों आदेश पूरी तरह प्रिंट करते हैं और आउटपुट टी कर सकते हैं वह यूनिकोड चरित्र। यह क्या काम नहीं करता है:

print obj 

और अब मैं फंस कर रहा हूँ क्योंकि इस फेंकता खतरनाक

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47: 

तो मैं क्या याद आ रही है? मैं क्या गलत कर रहा हूं? मैं एक सामान्य समाधान की तलाश में हूं, मैं हमेशा स्ट्रिंग को यूनिकोड के रूप में संभालना चाहता हूं, बस किसी भी संभावित त्रुटियों से बचने और एक संगत प्रोग्राम लिखने के लिए।

संपादित करें: मैं भी इस परिभाषित: प्रलेखन से

def __str__(self): 
    return self.__repr__() 
def __unicode__(self): 
    return self.__repr__() 

मुझे मिल गया है कि इस

+1

'प्रिंट ओबीजे' ऑब्जेक्ट के '__str__' का उपयोग करेगा, न कि '__repr__'। – BrenBarn

+2

आपका डिफ़ॉल्ट एन्कोडिंग क्या है? मेरा मतलब है * sys.getdefaultencoding() * –

+0

@ ब्रेनबर्न: __str__ को वापसी के रूप में लागू किया गया है __repr __() – javex

उत्तर

4

मैं अंत में इसे हल। समस्या यह थी (मुझे यकीन नहीं है कि क्यों) यदि आपने __str__() या __repr__() सीधे कॉल किया है तो यह इसे अच्छी तरह से संभालने के लिए हैपपैप होगा, लेकिन इसे सीधे प्रिंट करना (जैसा कि: print obj) काम नहीं करता है (हालांकि इसे केवल __str__() ही कॉल करना चाहिए)।

अंतिम सहायता इस article से आई थी। जब मैं यूटीएफ -8 एन्कोडिंग का उपयोग करता हूं तो मुझे पहले से ही उस चरण में जाना पड़ा जहां मुझे इसे कंसोल (लेकिन गलत पत्र) पर प्रिंट करने के लिए मिला। अंत में हल यह इस को परिभाषित करते हुए पूरी तरह से सही होने के लिए:

def __str__(self): 
    return self.__repr__().encode(stdout.encoding) 

अब केवल खुला प्रश्न है कि बनी हुई है: क्यों print obj.__str__() और print obj इस के साथ अलग ढंग से करते हैं? यह मुझे कोई समझ नहीं आता है। और हाँ, फिर से तनाव के लिए: पूर्व या __repr__() डीआईडी ​​काम को बुलाओ। और अभी भी स्पष्ट एन्कोडिंग के साथ करता है।

+0

सहायता लेख अब उपलब्ध नहीं है – Martlark

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

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