आप 3 या 4 या 5 समस्या है ... लेकिन repr()
और unicodedata.name()
अपने मित्रों को कर रहे हैं; वे print fubar
के परिणामों को संचारित करने वाले विभिन्न कंसोल एन्कोडिंग वाले लोगों द्वारा भ्रमित किए बिना भ्रम के बिना आपको जो कुछ मिला है, वह स्पष्ट रूप से आपको दिखाता है।
सारांश: या तो (ए) आप एक यूनिकोड ऑब्जेक्ट से शुरू करते हैं और उस पर अवांछित फ़ंक्शन लागू करते हैं या (बी) आप एक स्ट्र ऑब्जेक्ट से प्रारंभ करते हैं और आपका कंसोल एन्कोडिंग यूटीएफ -8 नहीं है।
यदि आप कहते हैं के रूप में आप एक यूनिकोड वस्तु के साथ शुरू:
>>> s0 = u'%C3%A7%C3%B6asd+fjkls%25asd'
>>> print repr(s0)
u'%C3%A7%C3%B6asd+fjkls%25asd'
इस एक आकस्मिक बकवास है। यदि आप urllibX.unquote_YYYY()
पर लागू करते हैं, तो आपको एक और बकवास यूनिकोड ऑब्जेक्ट (u'\xc3\xa7\xc3\xb6asd+fjkls%asd'
) मिलता है जो मुद्रित होने पर आपके दिखाए गए लक्षणों का कारण बनता है।आप एक str वस्तु तुरंत करने के लिए अपने मूल यूनिकोड वस्तु परिवर्तित करना चाहिए:
>>> s1 = s0.encode('ascii')
>>> print repr(s1)
'%C3%A7%C3%B6asd+fjkls%25asd'
तो आप इसके गंदें शब्द बोलना चाहिए:
>>> import urllib2
>>> s2 = urllib2.unquote(s1)
>>> print repr(s2)
'\xc3\xa7\xc3\xb6asd+fjkls%asd'
कि के पहले 4 बाइट को देखते हुए, यह UTF-8 में एन्कोड किया। यदि आप print s2
करते हैं, तो यह ठीक लगेगा यदि आपका कंसोल यूटीएफ -8 की अपेक्षा कर रहा है, लेकिन यदि यह आईएसओ -885 9 -1 (उर्फ लैटिन 1) की अपेक्षा कर रहा है तो आपको अपना लक्षण कचरा दिखाई देगा (पहला चार ए-टिल्डे होगा)। चलो पार्क है कि एक पल के लिए सोचा और यह एक यूनिकोड वस्तु में बदलने का:
>>> s3 = s2.decode('utf8')
>>> print repr(s3)
u'\xe7\xf6asd+fjkls%asd'
और देखने के लिए क्या हम वास्तव में मिल गया है यह निरीक्षण:
>>> import unicodedata
>>> for c in s3[:6]:
... print repr(c), unicodedata.name(c)
...
u'\xe7' LATIN SMALL LETTER C WITH CEDILLA
u'\xf6' LATIN SMALL LETTER O WITH DIAERESIS
u'a' LATIN SMALL LETTER A
u's' LATIN SMALL LETTER S
u'd' LATIN SMALL LETTER D
u'+' PLUS SIGN
की तरह जो आपने कहा है कि आप की उम्मीद लग रहा है। अब हम इसे आपके कंसोल पर प्रदर्शित करने के सवाल पर आते हैं। नोट: जब आप "cp850" देखते हैं तो बाहर निकलना न करें; मैं यह पोर्टेबल कर रहा हूं और विंडोज़ पर कमांड प्रॉम्प्ट में ऐसा करने के लिए बस ऐसा करता हूं।
>>> import sys
>>> sys.stdout.encoding
'cp850'
>>> print s3
çöasd+fjkls%asd
नोट: यूनिकोड ऑब्जेक्ट को sys.stdout.encoding का उपयोग करके स्पष्ट रूप से एन्कोड किया गया था। सौभाग्य से s3
में सभी यूनिकोड वर्ण उस एन्कोडिंग (और सीपी 1252 और लैटिन 1) में प्रतिनिधित्व योग्य हैं।
कृपया अपने प्रयास किए गए सहायकों को एक पक्ष का समर्थन करें और 'आयात sys निष्पादित करने के परिणाम प्रकाशित करें; प्रिंट sys.stdout.encoding' –
दरअसल, डिकोडिंग स्वयं शायद ठीक काम कर रहा है, लेकिन कंसोल डिस्प्ले के लिए रीकोडिंग में समस्या हो सकती है। – ncoghlan