2012-06-15 9 views
6

में एन्कोडिंग त्रुटियों को रोकें मेरे पास स्क्रिप्ट हैं जो लॉगिंग सिस्टम द्वारा संदेश मुद्रित करती हैं या कभी-कभी प्रिंट कमांड करती हैं। Windows कंसोल पर मैं जैसेपायथन

Traceback (most recent call last): 
    File "C:\Python32\lib\logging\__init__.py", line 939, in emit 
    stream.write(msg) 
    File "C:\Python32\lib\encodings\cp850.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u2019' in position 4537:character maps to <undefined> 

वहाँ एक सामान्य तरीके से प्रवेश प्रणाली में सभी एन्कोडिंग बनाने के लिए है, तो प्रिंट आदेश, आदि त्रुटि संदेश फेल-सेफ (त्रुटियों को अनदेखा)?

उत्तर

9

समस्या यह है कि आपका टर्मिनल/खोल (आपके द्वारा विंडोज़ पर cmd) प्रत्येक यूनिकोड चरित्र को मुद्रित नहीं कर सकता है।

आप str.encode विधि के तर्क के साथ अपने तारों को सुरक्षित-सुरक्षित एन्कोड कर सकते हैं। उदाहरण के लिए आप सेट करके ? के साथ समर्थित वर्णों को प्रतिस्थापित नहीं कर सकते हैं।

>>> s = u'\u2019' 
>>> print s 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\encodings\cp850.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can\'t encode character u'\u2019' in position 
0: character maps to <undefined> 
>>> print s.encode('cp850', errors='replace') 
? 

अन्य विकल्पों के लिए documentation देखें।

संपादित आप प्रवेश के लिए एक सामान्य समाधान चाहते हैं, तो आप कर सकते हैं उपवर्ग StreamHandler:

class CustomStreamHandler(logging.StreamHandler): 

    def emit(self, record): 
     record = record.encode('cp850', errors='replace') 
     logging.StreamHandler.emit(self, record) 
+0

लेकिन अगर मैं पहले से एनकोड सभी स्ट्रिंग्स वे (बाइट्स) प्रकार है जिसमें उनके व्यवहार बदल सकता है बदल आंतरिक? इसके अलावा यह अंतर्निहित कोडेक पुस्तकालय में है। मैं इसे बदल नहीं सकता। क्या मैं कोडेक में एक विकल्प सेट कर सकता हूं? – Gerenuk

+0

आप बस प्रिंटिंग/लॉगिंग से पहले उन्हें एन्कोड करते हैं। – schlamar

+0

एक सामान्य लॉगिंग समाधान के साथ मेरा जवाब संपादित किया। – schlamar