python एनकोड/डीकोड के बीच क्या अंतर है?




string unicode (6)

mybytestring.encode (somecodec) कुछ कोडेक के इन मानों के लिए सार्थक है:

  • बेस 64
  • BZ2
  • zlib
  • हेक्स
  • quopri
  • ROT13
  • string_escape
  • तुम तुम

मुझे यकीन नहीं है कि पहले से ही डीकोड किए गए यूनिकोड टेक्स्ट को डीकोड करने के लिए क्या अच्छा है। ऐसा लगता है कि किसी भी एन्कोडिंग के साथ हमेशा सिस्टम के डिफ़ॉल्ट एन्कोडिंग के साथ एन्कोड करने का प्रयास किया जाता है।

मुझे कभी यकीन नहीं है कि मैं str / यूनिकोड डीकोड और एन्कोड के बीच अंतर को समझता हूं।

मुझे पता है कि str().decode() तब होता है जब आपके पास बाइट्स की एक स्ट्रिंग होती है जिसे आप जानते हैं कि एक निश्चित वर्ण एन्कोडिंग है, यह देखते हुए कि एन्कोडिंग नाम यह एक यूनिकोड स्ट्रिंग लौटाएगा।

मुझे पता है कि unicode().encode() एक दिए गए एन्कोडिंग नाम के अनुसार यूनिकोड वर्णों को बाइट्स की एक स्ट्रिंग में परिवर्तित करता है।

लेकिन मुझे समझ में नहीं आता कि str().encode() और unicode().decode() लिए हैं। क्या कोई भी समझा सकता है, और संभवतः मुझे कुछ और भी सही कर सकता है जिसे मैंने ऊपर गलत पाया है?

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

कई उत्तर एक स्ट्रिंग पर .encode क्या करता है, इस बारे में जानकारी देते हैं, लेकिन कोई भी यह नहीं जानता कि .decode यूनिकोड के लिए क्या करता है।


बाइट्स की स्ट्रिंग के रूप में यूनिकोड स्ट्रिंग का प्रतिनिधित्व करने के लिए एन्कोडिंग के रूप में जाना जाता है। u'...'.encode(encoding)

उदाहरण:

    >>> u'æøå'.encode('utf8')
    '\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8\xc3\x83\xc2\xa5'
    >>> u'æøå'.encode('latin1')
    '\xc3\xa6\xc3\xb8\xc3\xa5'
    >>> u'æøå'.encode('ascii')
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: 
    ordinal not in range(128)

जब भी आपको आईओ के लिए इसका उपयोग करने की आवश्यकता होती है, तो आप आम तौर पर एक यूनिकोड स्ट्रिंग को एन्कोड करते हैं, उदाहरण के लिए इसे नेटवर्क पर स्थानांतरित करें, या इसे डिस्क फ़ाइल में सहेजें।

एक यूनिकोड स्ट्रिंग में बाइट्स की स्ट्रिंग को कन्वर्ट करने के लिए डीकोडिंग के रूप में जाना जाता है। unicode('...', encoding) या '...'। डीकोड (एन्कोडिंग) का प्रयोग करें।

उदाहरण:

   >>> u'æøå'
   u'\xc3\xa6\xc3\xb8\xc3\xa5' # the interpreter prints the unicode object like so
   >>> unicode('\xc3\xa6\xc3\xb8\xc3\xa5', 'latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'
   >>> '\xc3\xa6\xc3\xb8\xc3\xa5'.decode('latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'

जब भी आप नेटवर्क से या डिस्क फ़ाइल से स्ट्रिंग डेटा प्राप्त करते हैं तो आप आम तौर पर बाइट्स की स्ट्रिंग को डीकोड करते हैं।

मेरा मानना ​​है कि पाइथन 3 में यूनिकोड हैंडलिंग में कुछ बदलाव हैं, इसलिए उपरोक्त शायद पाइथन 3 के लिए सही नहीं है।

कुछ अच्छे लिंक:



anUnicode। एनकोड ('एन्कोडिंग') परिणाम स्ट्रिंग ऑब्जेक्ट में होते हैं और यूनिकोड ऑब्जेक्ट पर कॉल किए जा सकते हैं

एक स्ट्रिंग। डीकोड ('एन्कोडिंग') परिणाम एक यूनिकोड ऑब्जेक्ट में होते हैं और दिए गए एन्कोडिंग में एन्कोड किए गए स्ट्रिंग पर कॉल किया जा सकता है।

कुछ और स्पष्टीकरण:

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

लेकिन एक समय आता है, जब आप अपने यूनिकोड ऑब्जेक्ट को कंसोल या कुछ टेक्स्ट फ़ाइल में प्रिंट करना चाहते हैं। तो आपको इसे एन्कोड करना होगा (उदाहरण के लिए - यूटीएफ -8 में), आप एन्कोड ('utf-8') को कॉल करते हैं और आपको '\ u <someNumber>' के साथ एक स्ट्रिंग मिलती है, जो पूरी तरह से प्रिंट करने योग्य है।

फिर, फिर - आप यूटीएफ -8 में एन्कोड किए गए विपरीत-पढ़ने वाली स्ट्रिंग करना चाहते हैं और इसे यूनिकोड के रूप में मानते हैं, इसलिए \ u360 एक वर्ण होगा, न कि 5। फिर आप एक स्ट्रिंग (चयनित एन्कोडिंग के साथ) को डीकोड करते हैं और यूनिकोड प्रकार के ब्रांड की नई वस्तु प्राप्त करें।

एक साइड नोट के रूप में - आप कुछ विकृत एन्कोडिंग का चयन कर सकते हैं, जैसे कि 'ज़िप', 'बेस 64', 'सड़ांध' और उनमें से कुछ स्ट्रिंग से स्ट्रिंग में परिवर्तित हो जाएंगे, लेकिन मेरा मानना ​​है कि सबसे आम मामला वह है जिसमें यूटीएफ -8 शामिल है / यूटीएफ -16 और स्ट्रिंग।


सरल जवाब यह है कि वे एक-दूसरे के बिल्कुल विपरीत हैं।

आइए उदाहरण के लिए उदाहरण का प्रयोग करें:

कंप्यूटर सूचनाओं को स्टोर और संसाधित करने के लिए बाइट की बहुत ही बुनियादी इकाई का उपयोग करता है, यह मानव आंखों के लिए व्यर्थ है।

उदाहरण के लिए, '\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87' दो चीनी वर्णों का प्रतिनिधित्व है, लेकिन कंप्यूटर केवल जानता है (अर्थ प्रिंट या स्टोर) यह चीनी वर्ण है जब उन्हें देखने के लिए एक शब्दकोश दिया जाता है चीनी शब्द, इस मामले में, यह "utf-8" शब्दकोश है, और यदि आप एक अलग या गलत शब्दकोश (एक अलग डिकोडिंग विधि का उपयोग कर) में देखते हैं तो यह इच्छित चीनी शब्द को सही ढंग से दिखाने में विफल रहेगा।

उपर्युक्त मामले में, चीनी शब्द की तलाश करने के लिए कंप्यूटर की प्रक्रिया डीकोडिंग () है।

और कंप्यूटर को कंप्यूटर मेमोरी में लिखने की प्रक्रिया एनकोड () है।

इसलिए एनकोड जानकारी कच्चे बाइट्स है, और डीकोडेड जानकारी कच्चे बाइट्स और संदर्भ के लिए शब्दकोश का नाम है (लेकिन शब्दकोश स्वयं नहीं)।


यूनिकोड स्ट्रिंग्स की decode विधि में वास्तव में कोई भी अनुप्रयोग नहीं है (जब तक कि आपके पास किसी कारण से यूनिकोड स्ट्रिंग में कुछ गैर-टेक्स्ट डेटा न हो - नीचे देखें)। यह मुख्य रूप से ऐतिहासिक कारणों से है, मुझे लगता है। पायथन 3 में यह पूरी तरह से चला गया है।

unicode().decode() डिफ़ॉल्ट (एएससीआई) कोडेक का उपयोग करके s एक अंतर्निहित एन्कोडिंग करेगा। इसे इस तरह सत्यापित करें:

>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

>>> s.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

त्रुटि संदेश बिल्कुल वही हैं।

str().encode() यह दूसरी तरफ है - यह डिफ़ॉल्ट एन्कोडिंग के साथ एक अंतर्निहित डिकोडिंग का प्रयास करता है:

>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)

इस तरह प्रयुक्त, str().encode() भी अनावश्यक है।

लेकिन बाद की विधि का एक और अनुप्रयोग उपयोगी है: ऐसे encodings जिनके पास चरित्र सेट के साथ कुछ लेना देना नहीं है, और इस प्रकार 8-बिट स्ट्रिंग्स को सार्थक तरीके से लागू किया जा सकता है:

>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'

आप सही हैं, हालांकि: इन दोनों अनुप्रयोगों के लिए "एन्कोडिंग" का अस्पष्ट उपयोग ... अजीब है। फिर, पायथन 3 में अलग byte और string प्रकारों के साथ, यह अब कोई मुद्दा नहीं है।







python-2.x