2009-03-07 7 views
11

मैं यूनिकोड वस्तुओं की tuples की एक सूची है मुद्रित करने के लिए कैसे:मूल भाषा में यूनिकोड तार के tuples ('u'foo नहीं फार्म)

>>> t = [('亀',), ('犬',)] 

मुद्रण यह पता है, मैं मिलता है:

>>> print t 
[('\xe4\xba\x80',), ('\xe7\x8a\xac',)] 

जो मुझे लगता है कि उन तारों के utf-8 बाइट-कोड प्रतिनिधित्व की एक सूची है?

लेकिन क्या मैं बाहर मुद्रित देखना चाहते हैं, है आश्चर्य:

[('亀',), ('犬',)] 

लेकिन मैं मुसीबत का एक अत्यधिक राशि बाईटकोड एक मानव पठनीय रूप में वापस जाने के आ रही है।

उत्तर

7

लेकिन क्या मैं बाहर मुद्रित देखना चाहते हैं, है आश्चर्य:

[('亀',), ('犬',)]

क्या कर आप इसे देखना चाहते हैं पर मुद्रित? क्योंकि अगर यह कंसोल है, तो यह बिल्कुल गारंटी नहीं है कि आपका कंसोल उन पात्रों को प्रदर्शित कर सकता है। यही कारण है कि पाइथन का 'repr()' ऑब्जेक्ट का प्रतिनिधित्व \ -escapes के सुरक्षित विकल्प के लिए जाता है, जिसे आप हमेशा स्क्रीन पर देख सकते हैं और आसानी से टाइप कर सकते हैं।

एक शर्त के रूप में आपको यूनिकोड स्ट्रिंग्स (यू ') का उपयोग करना चाहिए। और, जैसा कि मैथ्यू द्वारा उल्लेख किया गया है, यदि आप सीधे स्रोत में '亀' लिखने में सक्षम होना चाहते हैं तो आपको यह सुनिश्चित करना होगा कि पायथन फ़ाइल के एन्कोडिंग को पढ़ सके। गैर-ASCII वर्णों के कभी-कभी उपयोग के लिए आप बचने वाले संस्करण 'u4e80' से चिपकने के लिए सबसे अच्छा है, लेकिन जब आपके पास बहुत सारे पूर्वी एशियाई पाठ हैं जिन्हें आप पढ़ने में सक्षम होना चाहते हैं, तो "# कोडिंग = utf-8" निश्चित रूप से जाने का रास्ता।

प्रिंट '[% s]'% ',' .join ([',' .join ('(% s,)'% ',' .join (ti) टी में टीआई के लिए)]

जो उद्धरणों से अनचाहे वर्णों को मुद्रित करेगा। वास्तव में आप चाहते हैं चाहते हैं:

def reprunicode(u): 
    return repr(u).decode('raw_unicode_escape') 

print u'[%s]' % u', '.join([u'(%s,)' % reprunicode(ti[0]) for ti in t]) 

यह काम करेगा, लेकिन अगर सांत्वना यूनिकोड का समर्थन नहीं किया है (और यह विंडोज पर विशेष रूप से परेशानी है), तो आप एक बड़ी वर्ष UnicodeError मिलेगा।

किसी भी मामले में, यह शायद ही कभी मायने रखता है क्योंकि किसी ऑब्जेक्ट का repr() जो आप यहां देख रहे हैं, आमतौर पर इसे एप्लिकेशन के सार्वजनिक उपयोगकर्ता इंटरफ़ेस में नहीं बनाता है; यह वास्तव में केवल कोडर के लिए है।

हालांकि, आप को पता है अजगर 3.0 बर्ताव करता है कि बिल्कुल के रूप में आप चाहते हैं खुश हो जाएगा:

  • सादे 'यू' उपसर्ग 'बिना तार' अब यूनिकोड तार कर रहे हैं
  • रेपर() सबसे पता चलता शब्दशः Windows कंसोल में
  • यूनिकोड बेहतर समर्थित है

अजगर 3.0 (आप अभी भी अगर अपने वातावरण को UTF-8 नहीं है यूनिक्स पर UnicodeError प्राप्त कर सकते हैं) यूनिकोड वर्ण एक छोटा सा नया है और पुस्तकालयों द्वारा इतनी अच्छी तरह से समर्थित नहीं है, लेकिन यह आपकी आवश्यकताओं के अनुरूप बेहतर हो सकता है।

+0

'raw_unicode_escape' एन्कोडिंग को इंगित करने के लिए धन्यवाद। मुझे नहीं पता था कि अस्तित्व में था! – Matthew

0

प्रयास करें:

import codecs, sys 
sys.stdout = codecs.getwriter('utf8')(sys.stdout) 
+0

आप किसी भी संयोग से एमएस विंडोज़ का उपयोग कर रहे हैं? यदि हां, तो आप इसे टैग करना होगा क्योंकि यह उत्तर की सीमा बदल सकती है जो आपके लिए काम करेगी। – MarkusQ

2

अजगर स्रोत कोड फ़ाइलों को कड़ाई से ASCII, तो आप जब तक आप एनकोडिंग निर्दिष्ट \u भागने दृश्यों का उपयोग करना चाहिए रहे हैं। PEP 0263 देखें।

#!/usr/bin/python 
# coding=utf-8 
t = [u'亀', u'犬'] 
print t 

जब आप print को एक सरणी गुजरती हैं, अजगर एक स्ट्रिंग पायथन के rules for string conversions का उपयोग करते हुए वस्तु बदल देता है। ऐसे रूपांतरणों का आउटपुट eval() के लिए डिज़ाइन किया गया है, यही कारण है कि आप उन \u अनुक्रमों को देखते हैं। बॉबन्स के समाधान के आधार पर घूमने के लिए यहां एक हैक है। कंसोल को यूनिकोड स्वीकार करना होगा या यह अपवाद फेंक देगा।

t = [(u'亀',), (u'犬',)] 
print repr(t).decode('raw_unicode_escape') 
+0

जब मैं ऐसा करता हूं, तो अब मुझे मिलता है: [(u '\ u4e80',), (u '\ u72ac',)] जो अलग है, लेकिन जो मैं चाहता हूं वह नहीं। –

0

तो यह है कि मैं क्या करना चाहते हैं प्रकट होता है:

print '[%s]' % ', '.join([', '.join('(%s,)' % ', '.join(ti) for ti in t)]) 


>>> t = [('亀',), ('犬',)] 
>>> print t 
[('\xe4\xba\x80',), ('\xe7\x8a\xac',)] 
>>> print '[%s]' % ', '.join([', '.join('(%s,)' % ', '.join(ti) for ti in t)]) 
[(亀,), (犬,)] 

निश्चित रूप से वहाँ यह करने के लिए एक बेहतर तरीका है।

(लेकिन इस प्रकार के दो अन्य उत्तरों का परिणाम मूल स्ट्रिंग को वांछित के रूप में मुद्रित नहीं किया जाता है)।

+0

"sys.stdout = codecs.getwriter ('utf8') (sys.stdout)" उदाहरण कैसे विफल रहता है? शायद आप एक टर्मिनल पर हैं जो utf8 के अलावा कुछ और उपयोग करता है? –

+0

मैंने एड्रेस आउटपुट पर भी अपना जवाब संशोधित कर दिया है। – Matthew

+0

दरअसल, मैंने अभी बॉबन्स के जवाब को देखा। बड़े पैमाने पर इसे सरल बनाना संभव है! – Matthew

3

सबसे पहले, आपकी पोस्ट में थोड़ी सी गलतफहमी है। आप इस तरह से एक सूची निर्धारित हैं:

>>> t = [('亀',), ('犬',)] 

... उन unicode रों आपके द्वारा निर्धारित है, लेकिन str रों नहीं हैं। आप unicode प्रकार करना चाहते हैं, तो आप चरित्र से पहले एक u जोड़ने के लिए:

>>> t = [(u'亀',), (u'犬',)] 

लेकिन मान लें कि आप वास्तव में चाहते हैं str रों, नहीं unicode रों करते हैं। मुख्य समस्या यह है कि __str__ किसी सूची (या एक ट्यूपल) की विधि व्यावहारिक रूप से __repr__ विधि के बराबर होती है (जो एक स्ट्रिंग देता है, जब मूल्यांकन किया जाता है, तो बिल्कुल वही ऑब्जेक्ट बना देगा)। चूंकि __repr__ विधि एन्कोडिंग-स्वतंत्र होना चाहिए, तारों को सबसे सुरक्षित मोड में प्रदर्शित किया जाना चाहिए, यानी ASCII रेंज के बाहर प्रत्येक वर्ण को हेक्स वर्ण (\xe4, उदाहरण के लिए) के रूप में दर्शाया गया है।

दुर्भाग्यवश, जहां तक ​​मुझे पता है, वहां एक सूची मुद्रित करने के लिए कोई लाइब्रेरी विधि नहीं है जो लोकेल-जागरूक है।आप इस तरह लगभग एक-सामान्य प्रयोजन समारोह इस्तेमाल कर सकते हैं:

def collection_str(collection): 
    if isinstance(collection, list): 
     brackets = '[%s]' 
     single_add = '' 
    elif isinstance(collection, tuple): 
     brackets = '(%s)' 
     single_add =',' 
    else: 
     return str(collection) 
    items = ', '.join([collection_str(x) for x in collection]) 
    if len(collection) == 1: 
     items += single_add 
    return brackets % items 

>>> print collection_str(t) 
[('亀',), ('犬',)] 

ध्यान दें कि यह सब संभव संग्रह (सेट और शब्दकोशों, उदाहरण के लिए) के लिए काम नहीं करेगा, लेकिन यह यह उन को संभालने के लिए विस्तार करने के लिए आसान है।

+0

इसके अलावा, "रिटर्न स्ट्र (संग्रह)" में 'उद्धरण (या स्ट्रिंग में \ जैसे अक्षर से बचें) शामिल नहीं होंगे; आप [(亀,), (犬,)] प्राप्त करते हैं। – bobince

+0

आप सही हैं, धन्यवाद। हम्म ... मैं इसे ठीक करने का कोई अच्छा तरीका नहीं देख सकता :) – DzinX

0

ऐसा लगता है कि लोग यहां क्या चाहते हैं लोग गायब हैं। जब मैं एक ट्यूपल से यूनिकोड प्रिंट करता हूं, तो मैं सिर्फ 'यू' से छुटकारा पाना चाहता हूं ['' ('और उद्धरण। जो हम चाहते हैं वह नीचे जैसा कार्य है। नेट को खराब करने के बाद यह सबसे साफ तरीका प्रतीत होता है परमाणु प्रदर्शन योग्य डेटा। डेटा एक टपल या सूची में नहीं है, तो मिल , मुझे नहीं लगता कि इस समस्या से मौजूद है।

def Plain(self, U_String) : 
      P_String = str(U_String) 
      m=re.search("^\(\u?\'(.*)\'\,\)$", P_String) 
      if (m) : #Typical unicode 
      P_String = m.group(1).decode("utf8") 
      return P_String 
संबंधित मुद्दे