2011-01-25 19 views
7

एन्कोड करने के लिए मैं इसे में विशिष्ट एन्कोडिंग हेक्स के बिना एक यूनिकोड स्ट्रिंग मुद्रित करने के लिए कोशिश कर रहा हूँ कोशिश करता है। मैं फेसबुक से इस डेटा को पकड़ रहा हूं जिसमें यूटीएफ -8 के एचटीएमएल हेडर में एक एन्कोडिंग प्रकार है। जब मैं टाइप प्रिंट करता हूं - यह यूनिकोड कहता है, लेकिन फिर जब मैं इसे यूनिकोड-एस्केप के साथ डीकोड करने का प्रयास करता हूं तो कहता है कि एक एन्कोडिंग त्रुटि है। जब मैं डिकोड विधि का उपयोग करता हूं तो यह एन्कोड करने का प्रयास क्यों कर रहा है?डिकोड समारोह अजगर

कोड

a='really long string of unicode html text that i wont reprint' 
print type(a) 
>>> <type 'unicode'> 
print a.decode('unicode-escape') 
>>> Traceback (most recent call last): 
    File "scfbp.py", line 203, in myFunctionPage 
    print a.decode('unicode-escape') 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 1945: ordinal not in range(128) 

उत्तर

8

यह डिकोड कि नाकाम रहने नहीं है। ऐसा इसलिए है क्योंकि आप परिणाम को कंसोल पर प्रदर्शित करने की कोशिश कर रहे हैं। जब आप प्रिंट का उपयोग करते हैं तो यह एएससीआईआईआई डिफ़ॉल्ट एन्कोडिंग का उपयोग करके स्ट्रिंग को एन्कोड करता है। प्रिंट का उपयोग न करें और इसे काम करना चाहिए।

 
>>> a=u'really long string containing \\u20ac and some other text' 
>>> type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 
u'really long string containing \u20ac and some other text' 
>>> print a.decode('unicode-escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128) 

मैं आईडीईएल या कुछ अन्य दुभाषिया का उपयोग करने की अनुशंसा करता हूं जो यूनिकोड आउटपुट कर सकता है, तो आपको यह समस्या नहीं मिलेगी।


अद्यतन: ध्यान दें कि यह एक कम बैकस्लैश, जहां यह डिकोड दौरान विफल रहता है के साथ situtation के समान नहीं है, लेकिन एक ही त्रुटि संदेश के साथ:

 
>>> a=u'really long string containing \u20ac and some other text' 
>>> type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128) 
+0

यह अपने त्रुटि के लिए कारण नहीं है। वह एक यूनिकोड ऑब्जेक्ट को डीकोड करने का प्रयास कर रहा है। आप यूनिकोड डेटा को बाइनरी डेटा से डिकोड के बाद से, अजगर 2 पहले होगा * एनकोड * यह है, जो यह ascii कोडेक के साथ करता है। यही असफल रहा है। –

+0

@Lennart Regebro: असल में मुझे लगता है कि अपने स्ट्रिंग के वास्तविक प्रकार 'str', नहीं' unicode' है। देखो कि वह स्ट्रिंग को कैसे शुरू कर रहा है - नोटिस वहां 'यू' नहीं है। मुझे लगता है कि उसके पास एक यूनिकोड स्ट्रिंग नहीं है, लेकिन एक * यूनिकोड-एस्केप * स्ट्रिंग (वही नहीं!)। यह वह है जिसे वह यूनिकोड को डीकोड करने की कोशिश कर रहा है। अगर मेरा सिद्धांत सही है तो मुझे लगता है कि यह जवाब वास्तव में सही है। –

+0

@ मार्क बिअर्स: सच है, यह असंगत है, लेकिन गलत टाइप टाइप करने से आप को याद करना आसान है। :) और त्रुटि वह करता है जो वह करता है। यदि आप एक यूनिकोड ऑब्जेक्ट को डीकोड करते हैं, तो आपको एन्कोड त्रुटि मिलती है। –

3

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

यह मैं हर अब और snags तो जब मैं डेटा के त्वरित प्रसंस्करण, उस में उदाहरण के लिए तुर्की पात्रों के साथ करते हैं।

आप Windows कमांड प्रॉम्प्ट के माध्यम से python.exe चला रहे हैं आप कुछ समाधान यहाँ पा सकते हैं: What encoding/code page is cmd.exe using। असल में आप chcp के साथ कोडपेज बदल सकते हैं लेकिन यह काफी बोझिल है। मैं Mark's advice का पालन करता हूं और आईडीएलई जैसे कुछ का उपयोग करता हूं।

+1

-1 की व्याख्या करने के लिए देखभाल? – Skurmedel

1
>>> print type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 

ऐसा क्यों है एन्कोड करने के लिए जब मैं डिकोड विधि का उपयोग करें कोशिश कर रहा है?

क्योंकि आप यूनिकोड को डिकोड, और आप से सांकेतिक शब्दों में बदलना। आपने यूनिकोड को यूनिकोड स्ट्रिंग को डीकोड करने का प्रयास किया है। इसके बाद पहली बात यह है कि इसे एसीआई कोडेक के साथ एक स्ट्रिंग में परिवर्तित करने का प्रयास करें। यही कारण है कि आप प्राप्त करते हैं:

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

याद रखें: यूनिकोड एन्कोडिंग नहीं है। बाकी सब कुछ है, जैसे एसीआईआई, यूटीएफ 8, लैटिन -1 आदि

यह निहित एन्कोडिंग पायथन 3, बीटीडब्ल्यू में चला गया है, क्योंकि यह लोगों को भ्रमित करता है।

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