2012-07-21 10 views
8

में एन्कोड और डीकोड नहीं समझा जाता है मैंने पाइथन में encode और decode को समझने की कोशिश की लेकिन मेरे लिए कुछ भी वास्तव में स्पष्ट नहीं है।मुझे पाइथन (2.7.3)

  1. str.encode([encoding,[errors]])
  2. str.decode([encoding,[errors]])

पहले, मैं इन दोनों कार्यों में "एन्कोडिंग" पैरामीटर की जरूरत समझ में नहीं आता।

प्रत्येक फ़ंक्शन का आउटपुट क्या है, इसकी एन्कोडिंग? प्रत्येक समारोह में "एन्कोडिंग" पैरामीटर का उपयोग क्या है? मैं वास्तव में "बाइट स्ट्रिंग" की परिभाषा को समझ नहीं पा रहा हूं।

मेरे पास एक महत्वपूर्ण सवाल है, क्या एक एन्कोडिंग से दूसरे में जाने का कोई तरीका है? मैंने "ऑक्टेट स्ट्रिंग" के बारे में ASN.1 पर कुछ पाठ पढ़ा है, इसलिए मुझे आश्चर्य हुआ कि यह "बाइट स्ट्रिंग" जैसा ही था।

आपकी मदद के लिए धन्यवाद।

+4

लेकिन आपने [डॉक्स] (http://docs.python.org/library/stdtypes.html#str.encode) पढ़ा था, है ना? क्षमा करें, मैं – tiwo

उत्तर

19

यह पायथन 2 (पायथन 3 की तुलना में) में थोड़ा अधिक जटिल है, क्योंकि यह 'स्ट्रिंग' और 'बाइटस्ट्रिंग' की अवधारणाओं को थोड़ा सा जटिल करता है, लेकिन The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets देखें। अनिवार्य रूप से, आपको समझने की आवश्यकता है कि 'स्ट्रिंग' और 'वर्ण' अमूर्त अवधारणाएं हैं जिन्हें सीधे कंप्यूटर द्वारा प्रदर्शित नहीं किया जा सकता है। एक बाइट्रिंग सीधे डिस्क से बाइट्स की कच्ची धारा है (या जिसे डिस्क से सीधे लिखा जा सकता है)। encode अमूर्त से कंक्रीट तक जाता है (आप इसे अधिमानतः एक यूनिकोड स्ट्रिंग देते हैं, और यह आपको एक बाइट स्ट्रिंग देता है); decode विपरीत तरीके से चला जाता है।

एन्कोडिंग नियम है जो कहता है कि 'ए' को बाइट 0x61 और 'α' द्वारा दो-बाइट अनुक्रम 0xc0\xb1 द्वारा दर्शाया जाना चाहिए।

+0

पूछ रहा हूं यदि मैं समझता हूं, एक स्ट्रिंग में दुभाषिया से वास्तव में कोई समस्या नहीं होती है, तो यह मशीनों के बीच विनिमय नहीं किया जा सकता है, इसलिए जब मैं str.encoding ("ascii") लिखता हूं, तो str वास्तविक हो जाता है, यह मेमोरी में उस उदाहरण में एएससीआई स्पेसिफिकेशंस के अनुसार कोड किया गया है और इसके एन्कोडिंग वैल्यू को एएससीआई द्वारा परिभाषित किया गया है और इस एन्कोडिंग को "बाइट स्ट्रिंग" कहा जाता है: यह सही है ?? –

+0

"बाइट्स स्ट्रिंग" में एक बाइट एक अतिरिक्त समर्थन का समर्थन कर सकता है? –

+1

@NarcisseDoudieuSiewe पहले प्रश्न के लिए, हाँ, यह सही है, हालांकि आपकी शब्दावली थोड़ा मिश्रित है - "एन्कोडिंग" ASCII है, अंतिम बाइटिंग नहीं - जिसे "एसीआईआई-एन्कोडेड स्ट्रिंग" कहा जा सकता है, उदाहरण के लिए। दूसरे प्रश्न के लिए, बाइटस्ट्रिंग का एक तत्व एक तत्व तत्व बाइट स्ट्रिंग है (पी 2 में, एक बाइटस्ट्रिंग केवल 'str' प्रकार है, और एक स्ट्रिंग' यूनिकोड 'प्रकार है), इसलिए' बी [0] + बी [0] 'संगतता करता है। यह पी 3 में अलग है, जहां एक बाइटस्ट्रिंग का एक तत्व वास्तव में 'int' है और इसलिए बी [0] + बी [0] 'int जोड़ है। – lvc

4

हां, एक बाइट स्ट्रिंग एक ऑक्टेट स्ट्रिंग है। एन्कोडिंग और डिकोडिंग तब होता है जब टेक्स्ट इनपुट/आउटपुट (कंसोल, फाइल, नेटवर्क, ... से)। आपका कंसोल आंतरिक रूप से यूटीएफ -8 का उपयोग कर सकता है, आपका वेब सर्वर लैटिन -1 परोसता है, और कुछ फ़ाइल स्वरूपों को बिबटेक्स के उच्चारण जैसे अजीब एन्कोडिंग की आवश्यकता होती है: fran\c{c}aise। आपको इनपुट/आउटपुट पर/से कनवर्ट करने की आवश्यकता है।

{en|de}code विधियां यह करती हैं। उन्हें अक्सर दृश्यों के पीछे बुलाया जाता है (उदाहरण के लिए, print "hello world" आपके टर्मिनल का उपयोग करने के लिए स्ट्रिंग को एन्कोड करता है)।

6

पायथन 2.x तार के दो प्रकार के होते हैं:

  • str = "बाइट तार" ओक्टेट्स की अनुक्रम =। इन दोनों का उपयोग "विरासत" चरित्र एन्कोडिंग (जैसे windows-1252 या IBM437) और कच्चे बाइनरी डेटा (जैसे struct.pack आउटपुट) के लिए किया जाता है।
  • unicode = "यूनिकोड तार" = UTF-16 या UTF-32 का अनुक्रम पाइथन कैसे बनाया गया है, इस पर निर्भर करता है।

यह मॉडल changed for Python 3.x था:

  • 2.x unicode 3.x str हो गया (और u उपसर्ग शाब्दिक से हटा दिया गया था)।
  • bytes प्रकार बाइनरी डेटा का प्रतिनिधित्व करने के लिए पेश किया गया था।

character encoding यूनिकोड तार और बाइट तारों के बीच एक मैपिंग है। एक बाइट स्ट्रिंग के लिए, एक यूनिकोड स्ट्रिंग बदलने के लिए, encode विधि का उपयोग करें:

>>> u'\u20AC'.encode('UTF-8') 
'\xe2\x82\xac' 

अन्य तरीके से बदलने के लिए, decode विधि का उपयोग करें:

>>> '\xE2\x82\xAC'.decode('UTF-8') 
u'\u20ac' 
14

PyCon से मेरे प्रस्तुति, Pragmatic Unicode, or, How Do I Stop The Pain के सभी को शामिल किया गया ये विवरण

संक्षेप में, यूनिकोड स्ट्रिंग कोड बिंदु नामक पूर्णांक के अनुक्रम हैं, और बाइटिंग बाइट्स के अनुक्रम हैं। एक एन्कोडिंग बाइट्स की श्रृंखला के रूप में यूनिकोड कोड बिंदुओं का प्रतिनिधित्व करने का एक तरीका है। तो unicode_string.encode(enc) "एन्क" के साथ एन्कोड किए गए यूनिकोड स्ट्रिंग की बाइट स्ट्रिंग वापस कर देगा, और byte_string.decode(enc) "एन्क" के साथ बाइट स्ट्रिंग को डीकोड करके बनाई गई यूनिकोड स्ट्रिंग को वापस कर देगा।

+0

यह आलेख इतना अच्छा है। इसे कई बार पढ़ने के लिए इसे बुकमार्क करना पड़ा। धन्यवाद! –

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