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




string unicode (5)

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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


कुछ एन्कोडिंग हैं जिनका उपयोग स्ट्र से स्ट्र या यूनिकोड से यूनिकोड तक डी-एन्कोड करने के लिए किया जा सकता है। उदाहरण के लिए बेस 64, हेक्स या यहां तक ​​कि rot13। वे कोडेक्स मॉड्यूल में सूचीबद्ध हैं।

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

एक यूनिकोड स्ट्रिंग पर डीकोड संदेश संबंधित एन्कोड ऑपरेशन पूर्ववत कर सकता है:

In [1]: u'0a'.decode('hex')
Out[1]: '\n'

लौटा प्रकार यूनिकोड की बजाय str है जो मेरी राय में दुर्भाग्यपूर्ण है। लेकिन जब आप स्ट्र और यूनिकोड के बीच उचित एन-डीकोड नहीं कर रहे हैं तो यह किसी भी तरह की गड़बड़ी की तरह दिखता है।


बाइट्स की स्ट्रिंग के रूप में यूनिकोड स्ट्रिंग का प्रतिनिधित्व करने के लिए एन्कोडिंग के रूप में जाना जाता है। 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 के लिए सही नहीं है।

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


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

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

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

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

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

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

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







python-2.x