2011-02-24 13 views
19

के लिए एक यूनिकोड स्ट्रिंग एन्कोडिंग के बारे में मैं छिड़का प्रिंट बयान के बहुत सारे के साथ एक काफी बड़े अजगर 2.6 आवेदन किया है। मैं पूरे यूनिकोड तारों का उपयोग कर रहा हूं, और यह आमतौर पर बहुत अच्छा काम करता है। हालांकि, अगर मैं आवेदन (जैसे "myapp.py> output.txt") के उत्पादन अनुप्रेषित, तो मैं कभी-कभी त्रुटियां इस जैसे मिलती है:लिनक्स/पायथन: प्रिंट

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128) 

मुझे लगता है कि अगर किसी को स्थापित किया है एक ही मुद्दा आता है ASCII के लिए उनके LOCALE। अब, मैं इस त्रुटि के कारण पूरी तरह से समझता हूं। मेरे यूनिकोड तारों में वर्ण हैं जो ASCII में एन्कोड करना संभव नहीं है। काफी उचित। लेकिन मैं अपने पायथन प्रोग्राम को कुछ समझने योग्य प्रिंट करने का प्रयास करने के लिए सबसे अच्छा प्रयास करना चाहता हूं, शायद संदिग्ध पात्रों को छोड़ना या उन्हें अपने यूनिकोड आईडी के साथ बदलना।

यह समस्या आम होना चाहिए ... इस समस्या से निपटने के लिए सबसे अच्छा तरीका क्या है? मैं एक समाधान पसंद करूंगा जो मुझे सादे पुराने "प्रिंट" का उपयोग करने की अनुमति देता है, लेकिन यदि आवश्यक हो तो मैं सभी घटनाओं को संशोधित कर सकता हूं।

पुनश्च: मैं अब इस समस्या का समाधान है। समाधान समाधान में से कोई भी नहीं था। मैंने http://wiki.python.org/moin/PrintFails पर दी गई विधि का उपयोग किया, जैसा कि क्रिसजे द्वारा टिप्पणियों में से एक में दिया गया है। यही है, मैं sys.stdout को एक रैपर के साथ प्रतिस्थापित करता हूं जो सही तर्कों के साथ यूनिकोड एन्कोड को कॉल करता है। बहुत अच्छी तरह से काम करता है।

+0

"एएससीआईआईआई" लोकेल कैसे है? की –

+0

संभव डुप्लिकेट [एक कमांड लाइन कार्यक्रम stdout के कूट के बारे में अनिश्चित हैं, तो क्या एन्कोडिंग चाहिए यह उत्पादन?] (http://stackoverflow.com/questions/5013599/if-a-command-line-program-is-unsure- की-stdouts एन्कोडिंग-क्या एन्कोडिंग-चाहिए-यह) –

+0

यहाँ दो संकेत दिए गए कि साबित हो सकता है कर रहे हैं उपयोगी: http://wiki.python.org/moin/PrintFails - http://stackoverflow.com/questions/1473577/ लेखन-यूनिकोड-स्ट्रिंग्स-थ्रू-सीएस-स्टडआउट-इन-पायथन – ChrisJ

उत्तर

5

अब मैंने इस समस्या को हल किया है। समाधान न तो दिए गए उत्तरों में से एक था। मैंने http://wiki.python.org/moin/PrintFails पर दी गई विधि का उपयोग किया, जैसा कि क्रिसजे द्वारा टिप्पणियों में से एक में दिया गया है। यही है, मैं sys.stdout को एक रैपर के साथ प्रतिस्थापित करता हूं जो सही तर्कों के साथ यूनिकोड एन्कोड को कॉल करता है। बहुत अच्छी तरह से काम करता है।

+1

मुझे दिए गए पेज पर कोई टिप्पणी नहीं दिखाई देती है। क्या आप यहां अपना समाधान पुन: पेश कर सकते हैं? –

18

आप एक ASCII टर्मिनल के लिए डंपिंग कर रहे हैं, मैन्युअल रूप से unicode.encode का उपयोग कर सांकेतिक शब्दों में बदलना है, और यह दर्शाते हैं कि त्रुटियों पर ध्यान नहीं दिया जाना चाहिए। UTF8 रूपांतरण> या के रूप में अंतिम उपाय अजगर डिफ़ॉल्ट एन्कोडिंग को बदलने - मनमाने ढंग से यूनिकोड

u = u'\xa0' 
print >>open('out', 'w'), u # This fails 
print >>open('out', 'w'), u.encode('utf-8') # This is ok 
2

या तो एक विधि के माध्यम से अपने सभी प्रिंट बयान लपेट करते हैं:

u = u'\xa0' 
u.encode('ascii') # This fails 
u.encode('ascii', 'ignore') # This replaces failed encoding attempts with empty string 

आप यूनिकोड फ़ाइलों को स्टोर करना चाहते हैं, यह कोशिश आपकी साइट के अंदर ascii से utf-8 तक आम तौर पर यह एक बुरा विचार है कि यूनिकोड स्ट्रिंग्स को sys.stdout में फ़िल्टर किया गया है क्योंकि पाइथन यूनिकोड स्ट्रिंग्स को इन्सिसी कॉन्फ़िगर किए गए डिफ़ॉल्ट एन्कोडिंग में इन्सिक्ट रूपांतरण को ट्रिगर करेगा।

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