2012-04-08 15 views
27

क्या आप विस्तार से समझा सकते हैं कि पायथन में बाइट स्ट्रिंग और यूनिकोड स्ट्रिंग के बीच क्या अंतर है। मैं this पढ़ा है:बाइट स्ट्रिंग बनाम यूनिकोड स्ट्रिंग। पायथन

बाइट कोड बस बाइट्स

के विन्यास में परिवर्तित स्रोत कोड है यह मतलब यह है अजगर का अपना कोडिंग/एन्कोडिंग प्रारूप है? या यह ऑपरेशन सिस्टम सेटिंग्स का उपयोग करता है? मुझे समझ में नहीं आता है। क्या आप कृपया समझा सकते हैं? धन्यवाद!

+8

coolinterview.com जानकारी का एक भयानक स्रोत जैसा दिखता है। मैं इस पर भरोसा नहीं करता। – bames53

+6

"बाइट कोड" आमतौर पर कुछ अलग तरीके से संदर्भित करता है, http://docs.python.org/glossary.html "पायथन स्रोत कोड बाइटकोड में संकलित किया गया है, सीपीथॉन दुभाषिया में पाइथन प्रोग्राम का आंतरिक प्रतिनिधित्व। बाइटकोड भी है .pyc और .pyo फ़ाइलों में कैश किया गया " – dbr

+0

+1 डीबीआर की टिप्पणी। बाइटकोड एक आंतरिक सीपीथन कार्यान्वयन विवरण है जो यूनिकोड से संबंधित नहीं है और आपको शायद चिंता करने की आवश्यकता नहीं है। – bobince

उत्तर

28

कोई पायथन अपने एन्कोडिंग का उपयोग नहीं करता है। यह किसी भी एन्कोडिंग का उपयोग करेगा जिस पर इसका उपयोग है और जिसे आप निर्दिष्ट करते हैं। str में एक वर्ण एक यूनिकोड चरित्र का प्रतिनिधित्व करता है। हालांकि 256 से अधिक वर्णों का प्रतिनिधित्व करने के लिए, व्यक्तिगत यूनिकोड एन्कोडिंग कई वर्णों का प्रतिनिधित्व करने के लिए प्रति से अधिक बाइट प्रति वर्ण का उपयोग करते हैं। bytearray ऑब्जेक्ट्स आपको अंडरलेइंग बाइट्स तक पहुंच प्रदान करते हैं। str ऑब्जेक्ट्स में encode विधि है जो एक एन्कोडिंग का प्रतिनिधित्व करने वाली स्ट्रिंग लेती है और bytearray ऑब्जेक्ट देता है जो उस एन्कोडिंग में स्ट्रिंग का प्रतिनिधित्व करती है। bytearray ऑब्जेक्ट्स में decode विधि है जो एक एन्कोडिंग का प्रतिनिधित्व करने वाली स्ट्रिंग लेती है और str लौटाती है जो दिए गए एन्कोडिंग में एन्कोड किए गए स्ट्रिंग के रूप में bytearray को समझने से परिणाम देती है। यहां एक उदाहरण दिया गया है।

>>> a = "αά".encode('utf-8') 
>>> a 
b'\xce\xb1\xce\xac' 
>>> a.decode('utf-8') 
'αά' 

हम कि UTF-8 चार बाइट्स, \ XCE, \ xb1, \ XCE, और \ XAC उपयोग कर रहा है दो अक्षर का प्रतिनिधित्व करने के देख सकते हैं। स्पॉल्स्की लेख के बाद कि इग्नासिओ वाज़्यूज़-एब्राम ने संदर्भित किया, मैं Python Unicode Howto पढ़ूंगा।

+16

आपको शायद यह उल्लेख करना चाहिए कि यह कोड पायथन 3 के लिए है। – ovgolovin

+2

आपका मतलब है 'बाइट्स' ऑब्जेक्ट्स, नहीं 'bytearray': वास्तव में,' टाइप ("é" .encode ('UTF-8')) '' बाइट्स 'है , 'bytearray' नहीं। – EOL

+0

कौन सा पायथन संस्करण? 2.7 इसे '' के रूप में रिपोर्ट करता है। –

19

यहां एक सरल स्पष्टीकरण का प्रयास है जो केवल पायथन 3 पर लागू होता है। मुझे उम्मीद है कि एक लेट व्यक्ति से आ रहा है, यह पूरी तरह से uninitiated के लिए कुछ भ्रम को दूर करने में मदद करेगा। यदि कोई तकनीकी त्रुटिपूर्णता है, तो कृपया मुझे क्षमा करें और इसे इंगित करने के लिए स्वतंत्र महसूस करें।

आप हमेशा की तरह अजगर 3 का उपयोग कर एक स्ट्रिंग बनाने मान लीजिए:

stringobject = 'ant' 

stringobject एक यूनिकोड स्ट्रिंग होगा।

यूनिकोड स्ट्रिंग यूनिकोड वर्णों से बना है। ऊपर stringobject में, यूनिकोड वर्ण अलग-अलग अक्षर हैं, उदा। ए, एन, टी

प्रत्येक यूनिकोड चरित्र को कोड बिंदु असाइन किया जाता है, जिसे हेक्स अंकों के अनुक्रम के रूप में व्यक्त किया जा सकता है (एक हेक्स अंक 16 मानों पर ले सकता है, 0-9 और ए-एफ से लेकर)। उदाहरण के लिए, 'a' पत्र '\u0091' के बराबर है, और 'चींटी' '\u0061\u006E\u0074' के बराबर है।

तो तुम कि यदि आप में टाइप करें,

stringobject = '\u0061\u006E\u0074' 
stringobject 

तुम भी उत्पादन 'ant' मिल जाएगा मिल जाएगा।

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

यह कैसे किया जाता है? चूंकि प्रत्येक हेक्स अंक 16 अलग-अलग मानों पर ले सकता है, इसलिए इसे 4-बिट बाइनरी अनुक्रम में प्रतिबिंबित किया जा सकता है (उदाहरण के लिए हेक्स अंक 0 को बाइनरी में 0000 के रूप में व्यक्त किया जा सकता है, हेक्स अंक 1 0001 के रूप में व्यक्त किया जा सकता है और आगे)। यदि एक यूनिकोड चरित्र में कोड हेक्टेयर होता है जिसमें चार हेक्स अंकों होते हैं, तो इसे एन्कोड करने के लिए 16-बिट बाइनरी अनुक्रम की आवश्यकता होगी।

विभिन्न एन्कोडिंग सिस्टम यूनिकोड को बिट्स में परिवर्तित करने के लिए अलग-अलग नियम निर्दिष्ट करते हैं। सबसे महत्वपूर्ण बात यह है कि एन्कोडिंग प्रत्येक यूनिकोड चरित्र को व्यक्त करने के लिए उपयोग की जाने वाली बिट्स की संख्या में भिन्न होती है।

उदाहरण के लिए, ASCII एन्कोडिंग सिस्टम प्रति चरित्र केवल 8 बिट्स (1 बाइट) का उपयोग करता है। इस प्रकार यह केवल दो हेक्स अंकों तक कोड बिंदुओं के साथ यूनिकोड वर्णों को एन्कोड कर सकता है (यानी 256 विभिन्न यूनिकोड वर्ण)। यूटीएफ -8 एन्कोडिंग सिस्टम प्रति चरित्र 8 से 32 बिट्स (1 से 4 बाइट्स) का उपयोग करता है, इसलिए यह 8 हेक्टेयर अंकों तक कोड बिंदुओं के साथ यूनिकोड वर्णों को एन्कोड कर सकता है, यानी सब कुछ।

निम्नलिखित कोड चल रहा है:

byteobject = stringobject.encode('utf-8') 
byteobject, type(byteobject) 

UTF-8 एन्कोडिंग प्रणाली का उपयोग कर एक बाइट स्ट्रिंग में एक यूनिकोड स्ट्रिंग बदल देता है, और b'ant', bytes' देता है।

ध्यान दें कि यदि आपने एन्कोडिंग सिस्टम के रूप में 'ASCII' का उपयोग किया है, तो आप किसी भी समस्या में नहीं भागेंगे क्योंकि 'चींटी' में सभी कोड बिंदु 1 बाइट के साथ व्यक्त किए जा सकते हैं। लेकिन अगर आपके पास एक यूनिकोड स्ट्रिंग था जिसमें दो हेक्टेयर अंकों से अधिक कोड बिंदु वाले वर्ण होते हैं, तो आपको UnicodeEncodeError मिल जाएगा।

इसी तरह,

stringobject = byteobject.decode('utf-8') 
stringobject, type(stringobject) 

आप 'ant', str देता है।

+0

(1) सामान्य रूप से, उपयोगकर्ता द्वारा अनुमानित चरित्र जैसे 'g̈' कई यूनिकोड कोडपॉइंट्स (इस मामले में यू +0067 यू +0308) के अनुरूप हो सकता है। (2) यूनिकोड कोडपॉइंट का एन्कोडिंग इसकी संख्या से असंबंधित हो सकता है यानी, 8-बिट एन्कोडिंग ~ 0x100 वर्णों का प्रतिनिधित्व कर सकती है, यह आवश्यक नहीं है कि ये सभी वर्ण * लगातार * होना चाहिए (यह आवश्यक नहीं है कि * "कोड चार हेक्स अंकों से युक्त बिंदु, इसे 16-बिट बाइनरी अनुक्रम की आवश्यकता होगी ताकि इसे एन्कोड किया जा सके "* - एक कोडपॉइंट को एन्कोड करने के लिए आवश्यक आकार के बारे में बात करना समझ में नहीं आता है - केवल वर्णों का एक सेट प्रतिबंध लगाता है) – jfs

+0

धन्यवाद। मैंने पढ़ा है सबसे अच्छा स्पष्टीकरण। – parsecer

2

उन लोगों के लिए जो अधिक गहराई से स्पष्टीकरण चाहते हैं, this PyCon presentation देखें।

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