2012-01-04 16 views
5
>>> s = 'auszuschließen' 
>>> print(s.encode('ascii', errors='xmlcharrefreplace')) 
b'auszuschließen' 
>>> print(str(s.encode('ascii', errors='xmlcharrefreplace'), 'ascii')) 
auszuschließen 

वहाँ एक खूबसूरत तरीका b'' के बिना किसी भी स्ट्रिंग मुद्रित करने के लिए है में यूनिकोड बच गए?मुद्रण अजगर

संपादित करें:

मैं सिर्फ अजगर से भाग पात्रों मुद्रित करने के लिए कोशिश कर रहा हूँ, और मेरे ही शिकायत है जब मैं ऐसा है कि अजगर "ख '' 'कहते है।

तो मैं विंडोज 7 की तरह एक गूंगा टर्मिनल में वास्तविक चरित्र देखना चाहता था, तो मैं इस मिल:

Traceback (most recent call last): 
    File "Mailgen.py", line 378, in <module> 
    marked_copy = mark_markup(language_column, item_row) 
    File "Mailgen.py", line 210, in mark_markup 
    print("TP: %r" % "".join(to_print)) 
    File "c:\python32\lib\encodings\cp437.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u2026' in position 29: character maps to <undefined> 
+1

आप केवल 'प्रिंट' का उपयोग क्यों नहीं कर रहे हैं? आपको एसीआईआई के रूप में एन्कोड करने की आवश्यकता क्यों है? – jcollado

+0

क्योंकि मुझे नहीं लगता कि मेरा टर्मिनल मेरे कोड प्रक्रियाओं के हर अजीब चरित्र का समर्थन करता है। –

+1

प्रिंट (str (s.encode ('ascii', त्रुटियों = 'अनदेखा'), 'ascii')) वैसे भी, सुंदर भी होगा। –

उत्तर

2
>>> s='auszuschließen…' 
>>> s 
'auszuschließen…' 
>>> print(s) 
auszuschließen… 
>>> b=s.encode('ascii','xmlcharrefreplace') 
>>> b 
b'auszuschlie&#223;en&#8230;' 
>>> print(b) 
b'auszuschlie&#223;en&#8230;' 
>>> b.decode() 
'auszuschlie&#223;en&#8230;' 
>>> print(b.decode()) 
auszuschlie&#223;en&#8230; 

आप एक यूनिकोड स्ट्रिंग के साथ शुरू। इसे ascii पर एन्कोड करने से आपके इच्छित वर्णों के साथ bytes ऑब्जेक्ट बनाता है। पाइथन इसे वापस स्ट्रिंग में परिवर्तित किए बिना प्रिंट नहीं करेगा और डिफ़ॉल्ट रूपांतरण b और उद्धरणों में रखता है। decode का उपयोग करके इसे स्पष्ट रूप से एक स्ट्रिंग में परिवर्तित कर देता है; डिफ़ॉल्ट एन्कोडिंग utf-8 है, और चूंकि आपके bytes में केवल ascii शामिल हैं जो utf-8 का सबसेट है, यह काम करने की गारंटी है।

+0

यह सबसे सुरुचिपूर्ण समाधान है अब तक। ध्यान दें कि मेरा टर्मिनल चुपचाप '...' में बदल जाता है। –

1

नहीं सभी टर्मिनलों 8 बिट वर्ण सेट के कुछ प्रकार की तुलना में अधिक संभाल कर सकते हैं, यह सच है । लेकिन वे इससे कोई फर्क नहीं पड़ता कि आप क्या करते हैं, वास्तव में।

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

अद्यतन:

जब से तुम को पता है कि वर्ण स्ट्रिंग में हैं चाहते हैं, आप वास्तव में उनके लिए यूनिकोड कोड, या इस मामले में एक्सएमएल बराबर जानना चाहते हैं। प्रिंटिंग की तुलना में यह अधिक निरीक्षण कर रहा है, और फिर आम तौर पर बी 'भाग प्रति समस्या नहीं है।

लेकिन तुम तो जैसे आसानी से और hackily यह से छुटकारा पाने के कर सकते हैं:

print(repr(s.encode('ascii', errors='xmlcharrefreplace'))[2:-1]) 
+0

Traceback (सबसे हाल कॉल पिछले): फ़ाइल "Mailgen.py", लाइन 378, में marked_copy = mark_markup (language_column, item_row) फ़ाइल "Mailgen.py", लाइन 210, mark_markup प्रिंट में ("टी.पी.: % r "%" ".join (to_print)) फ़ाइल" c: \ python32 \ lib \ encodings \ cp437.py ", पंक्ति 1, एन्कोड में codecs.charmap_encode (इनपुट, self.errors, encoding_map) [0) ] यूनिकोड एन्कोडर त्रुटि: 'charmap' कोडेक स्थिति में \ '2020' अक्षर को एन्कोड नहीं कर सकता है: चरित्र मानचित्र

+0

@CeesTimmerman: देखें, वहां आपके पास वास्तविक प्रश्न की शुरुआत है। आपको एक बनाना चाहिए। अपने टर्मिनल के बारे में जानकारी भी शामिल करें। –

+0

ठीक है: मैं 64-बिट विंडोज 7 एंटरप्राइज़ कमांड टर्मिनल (और अधिमानतः कोई अन्य टर्मिनल) में एक अज्ञात यूनिकोड स्ट्रिंग को पाइथोनिक रूप से प्रिंट कैसे करूं? –

0

आप अजगर 3 का उपयोग कर रहे हैं, आप कंसोल के लिए print(s) लिखने की क्षमता समर्थ बनाया कर रहे हैं।

मैं मानता हूँ कर सकते हैं कि, कंसोल पर निर्भर करता है, यह ठीक से मुद्रित करने में सक्षम नहीं हो सकता है, लेकिन मैं कल्पना कर सकते हैं कि 2006 के बाद से सबसे आधुनिक OSes एक मुद्दे के बहुत ज्यादा बिना यूनिकोड तार संभाल कर सकते हैं। मैं आपको यह कोशिश करने के लिए प्रोत्साहित करता हूं कि यह काम करता है या नहीं।

वैकल्पिक रूप से, आप एक फ़ाइल में कोई लाइनें (एक कुटिया के समान) से पहले इस रखकर एक कोडिंग लागू कर सकते हैं:

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

यह UTF-8 के रूप में यह रेंडर करने के लिए दुभाषिया बाध्य करेगा।

+0

धन्यवाद। मैं पहले से ही इसका उपयोग कर रहा हूँ। –

+0

64-बिट विंडोज 7 एंटरप्राइज़ कमांड टर्मिनल की यह प्रति, एक के लिए, सीपी 437 में नहीं वर्णों को प्रिंट करना पसंद नहीं करती है, उदा। '\ U2026'। –

+1

1. '# - * - कोडिंग: utf-8 - * - 'पायथन 3 पर डिफ़ॉल्ट है 2. यह नहीं बदलता कि' प्रिंट 'कैसे काम करता है। यह केवल प्रभावित करता है कि शाब्दिक तारों का अर्थ कैसे लिया जाता है। – jfs

3

डिबगिंग के लिए (अजगर 2 पर की तरह repr()) ascii प्रतिनिधित्व देखने के लिए:

print(ascii('auszuschließen…')) 
# -> 'auszuschlie\xdfen\u2026' 

बाइट्स मुद्रित करने के लिए:

sys.stdout.buffer.write('auszuschließen…'.encode('ascii', 'xmlcharrefreplace')) 
# -> auszuschlie&#223;en&#8230; 
+0

प्रिंट (ascii()) बी से छुटकारा पाता है, लेकिन उद्धरण नहीं ... –

+0

@Lennart Regebro: सही। '# -> 'वह दिखाता है। – jfs

+0

निकटतम निरीक्षण पर, मेरे टर्मिनल sys.stdout.buffer.write ('auszuschließen ... test'.encode (' ascii ',' xmlcharrefreplace ') में) प्रिंट: auszuschlie ß en.test24 मुझे विशेष मामलों को पसंद नहीं है (बेकार वापसी मूल्य मुद्रित हो जाता है), तो मैं डीकोड() समाधान के साथ जाऊंगा। –

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