2010-10-04 17 views
8

मैं चाहता हूं कि मेरा फ़ंक्शन एक तर्क लेने के लिए जो एक यूनिकोड ऑब्जेक्ट या एक यूटीएफ -8 एन्कोडेड स्ट्रिंग हो। मेरे फ़ंक्शन के अंदर, मैं तर्क को यूनिकोड में कनवर्ट करना चाहता हूं। मेरे पास ऐसा कुछ है:डीकोडिंग अगर यह यूनिकोड नहीं है

def myfunction(text): 
    if not isinstance(text, unicode): 
     text = unicode(text, 'utf-8') 

    ... 

क्या इंस्टेंसेंस के उपयोग से बचना संभव है? मैं कुछ और बतख-टाइपिंग दोस्ताना ढूंढ रहा था।

डीकोडिंग के साथ अपने प्रयोगों के दौरान, मैंने पाइथन के कई अजीब व्यवहारों में भाग लिया है। उदाहरण के लिए:

>>> u'hello'.decode('utf-8') 
u'hello' 
>>> u'cer\xf3n'.decode('utf-8') 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in po 
sition 3: ordinal not in range(128) 

या

>>> u'hello'.decode('utf-8') 
u'hello' 12:11 
>>> unicode(u'hello', 'utf-8') 
Traceback (most recent call last): 
File "<input>", line 1, in <module> 
TypeError: decoding Unicode is not supported 

वैसे। मैं पाइथन 2.6

+0

आप इस सवाल पर एक नज़र लेने के लिए चाहते हो सकता है: - (http://stackoverflow.com/questions/368805/) – tzot

उत्तर

14

तुम बस 'utf-8' कोडेक के साथ इसे डीकोड की कोशिश कर सकते हैं, और यह है कि अगर काम नहीं करता है, तो ऑब्जेक्ट प्रदान।

def myfunction(text): 
    try: 
     text = unicode(text, 'utf-8') 
    except TypeError: 
     return text 

print(myfunction(u'cer\xf3n')) 
# cerón 

जब आप एक यूनिकोड वस्तु लेने के लिए और साथ 'utf-8' कोडेक अपने decode विधि कॉल, अजगर पहले एक स्ट्रिंग वस्तु को यूनिकोड वस्तु कन्वर्ट करने के लिए कोशिश करता है, और फिर इसे स्ट्रिंग वस्तु की डिकोड ('utf-8' कॉल) तरीका।

कभी-कभी यूनिकोड ऑब्जेक्ट से स्ट्रिंग ऑब्जेक्ट में रूपांतरण विफल रहता है क्योंकि पायथन 2 डिफ़ॉल्ट रूप से एएससीआई कोडेक का उपयोग करता है।

तो, सामान्य रूप से, कभी भी यूनिकोड ऑब्जेक्ट को डीकोड करने का प्रयास न करें। या, यदि आपको कोशिश करनी है, तो कोशिश करें ... इसे छोड़कर ब्लॉक करें। कुछ कोडेक्स हो सकते हैं जिसके लिए पाइथन 2 (नीचे देखें) में डीकोडिंग यूनिकोड ऑब्जेक्ट्स काम करता है, लेकिन उन्हें पायथन 3 में हटा दिया गया है।

मुद्दा, का एक दिलचस्प चर्चा के लिए इस Python bug ticket देखें और यह भी Guido van Rossum's blog:

"हम कोडेक के लिए एक अलग दृष्टिकोण अपना रहे हैं: अजगर 2 में, codecs स्वीकार कर सकते हैं, जबकि या तो यूनिकोड या इनपुट के रूप में 8-बिट और उत्पादन या तो उत्पादन, Py3k में के रूप में, एन्कोडिंग हमेशा एक यूनिकोड (पाठ) से एक अनुवाद स्ट्रिंग बाइट्स की एक सरणी के लिए, और डिकोडिंग है हमेशा विपरीत हो जाता है दिशा। इसका मतलब यह है कि हम पड़ा (बस नहीं एनकोड/डीकोड एपीआई के माध्यम से उन रूपांतरण अब भी , समर्थित हैं) कुछ codecs कि में इस मॉडल फिट नहीं है ड्रॉप, उदाहरण के ROT13, बेस 64 और BZ2 के लिए। "

0

का उपयोग कर रहा हूं मुझे isinstance से बचने के किसी भी अच्छे तरीके से अवगत नहीं है, लेकिन शायद कोई और होगा। मैं बता सकता हूं कि आपके द्वारा उद्धृत दो अजीबताएं हैं क्योंकि आप ऐसा कुछ कर रहे हैं जो समझ में नहीं आता है: यूनिकोड में डीकोड करने की कोशिश कर रहा है जो पहले से ही यूनिकोड में डीकोड किया गया है।

पहले के बजाय इस तरह दिखना चाहिए, जो यूनिकोड संस्करण में कि स्ट्रिंग के UTF-8 एन्कोडिंग डीकोड:

>>> 'cer\xc3\xb3n'.decode('utf-8') 
u'cer\xf3n' 

और अपने दूसरे इस तरह दिखेगा (एक u'' यूनिकोड स्ट्रिंग शाब्दिक का उपयोग नहीं) चाहिए :

>>> unicode('hello', 'utf-8') 
u'hello' 
+0

अजीब लगता है एक यूनिकोड वस्तुओं है कि [? अजगर UnicodeDecodeError मैं यूनिकोड गलतफहमी हूँ] डीकोड विधि। यहां तक ​​कि वीडर यह भी है कि विधि कभी-कभी काम करती है और कभी-कभी नहीं होती है। यूनिकोड() कॉल के लिए समान है। –

+0

वैसे, निश्चित रूप से एपीआई के लिए कुछ अजीबता है, क्योंकि यूनिकोड स्ट्रिंग और एन के साथ 'यूनिकोड' पर कॉल ओ निर्दिष्ट एन्कोडिंग हमेशा काम करेगा जबकि निर्दिष्ट किसी भी एन्कोडिंग के साथ एक कॉल हमेशा असफल हो जाएगा। –

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