यूनिकोड और एनकोडिंग पूरी तरह से अलग, असंबंधित चीजें हैं।
यूनिकोड
प्रत्येक वर्ण को एक संख्यात्मक आईडी असाइन करता है:
- 0x41 → ए
- 0xE1 → á
- 0x414 → मित्र
तो, यूनिकोड 0x41 को A, 0xE1 को á, और 0x414 को Д.
यहां तक कि छोटा तीर → मैंने इसका यूनिकोड नंबर इस्तेमाल किया है, यह 0x2192 है। और यहां तक कि इमोजी में उनके यूनिकोड नंबर हैं, have 0x1F602 है।
आप इस तालिका में सभी वर्णों की यूनिकोड संख्या देख सकते हैं । विशेष रूप से, आप यहाँ ऊपर तीन अक्षर , यहाँ तीर , और यहाँ इमोजी पा सकते हैं ।
यूनिकोड द्वारा सभी वर्णों को सौंपे गए इन अंकों को कोड पॉइंट कहा जाता है ।
इन सभी का उद्देश्य प्रत्येक चरित्र को स्पष्ट रूप से संदर्भित करने के लिए एक साधन प्रदान करना है। उदाहरण के लिए, अगर मैं 😂 के बारे में बात कर रहा हूं, तो "आप जानते हैं, यह हंसी इमोजी आँसू के साथ" के बजाय , मैं बस यूनिकोड कोड बिंदु 0x1F602 कह सकता हूं । आसान है, है ना?
ध्यान दें कि यूनिकोड कोड पॉइंट्स को आमतौर पर एक अग्रणी के साथ स्वरूपित किया जाता है U+, फिर हेक्साडेसिमल न्यूमेरिक वैल्यू को कम से कम दो अंकों में विभाजित किया जाता है। तो, उपरोक्त उदाहरण U + 0041, U + 00E1, U + 0414, U + 2192, U + 1F602 होंगे।
यूनिकोड कोड पॉइंट U + 0000 से U + 10FFFF तक होता है। यानी 1,114,112 नंबर। इन नंबरों में से 2048 का उपयोग सरोगेट्स के लिए किया जाता है , इस प्रकार, 1,112,064 रह जाते हैं। इसका अर्थ है, यूनिकोड 1,112,064 अलग-अलग वर्णों को एक अद्वितीय आईडी (कोड बिंदु) प्रदान कर सकता है। इन सभी कोड बिंदुओं को अभी तक एक पात्र को नहीं सौंपा गया है, और यूनिकोड को लगातार बढ़ाया जाता है (उदाहरण के लिए, जब नए इमोजीस पेश किए जाते हैं)।
याद रखने वाली महत्वपूर्ण बात यह है कि सभी यूनिकोड आसान और असंदिग्ध संदर्भ के लिए प्रत्येक वर्ण के लिए एक संख्यात्मक आईडी, कोड बिंदु, कहते हैं।
एन्कोडिंग
बिट पैटर्न के लिए मानचित्र वर्ण।
कंप्यूटर मेमोरी या डिस्क पर वर्णों का प्रतिनिधित्व करने के लिए इन बिट पैटर्न का उपयोग किया जाता है।
कई अलग-अलग एनकोडिंग हैं जो वर्णों के विभिन्न सबसेट को कवर करते हैं। अंग्रेजी बोलने वाली दुनिया में, सबसे आम एनकोडिंग निम्नलिखित हैं:
मैप्स 128 अक्षर (कोड अंक U + 0000 से U + 007F) लंबाई 7 के बिट पैटर्न के लिए।
उदाहरण:
आप इस तालिका में सभी मैपिंग देख सकते हैं ।
मैप्स 191 अक्षर (कोड अंक U + 0020 से U + 007E और U + 00A0 से U + 00FF) लंबाई 8 के बिट पैटर्न के लिए।
उदाहरण:
- एक → 01100001 (0x61)
- á → 11100001 (0xE1)
आप इस तालिका में सभी मैपिंग देख सकते हैं ।
मैप्स 1,112,064 अक्षर (सभी मौजूदा यूनिकोड कोड बिंदु) या तो लंबाई 8, 16, 24, या 32 बिट्स (जो कि, 1, 2, 3, या 4 बाइट्स) के बिट पैटर्न के लिए हैं।
उदाहरण:
- एक → 01100001 (0x61)
- á → 11000011 10100001 (0xC3 0xA1)
- ≠ → 11100010 10001001 10100000 (0xE2 0x89 0xA0)
- 😂 → 11110000 10011111 10011000 10000010 (0xF0 0x9F 0x98 0x82)
जिस तरह से UTF-8 ने बिट स्ट्रिंग्स के लिए वर्णों को एनकोड किया है, वह यहाँ बहुत अच्छी तरह से वर्णित है ।
यूनिकोड और एनकोडिंग्स
उपरोक्त उदाहरणों को देखते हुए, यह स्पष्ट हो जाता है कि यूनिकोड कैसे उपयोगी है।
उदाहरण के लिए, यदि मैं लैटिन -1 हूं और मैं á के अपने एन्कोडिंग को समझाना चाहता हूं, तो मुझे यह कहने की आवश्यकता नहीं है:
"मैं समझता हूं कि 11100001 के रूप में एक ऐगू के साथ (या हालांकि आप उस बढ़ते बार को कॉल करते हैं)"
लेकिन मैं सिर्फ इतना कह सकता हूं:
"मैं 11100001 के रूप में U + 00E1 को एनकोड करता हूं"
और अगर मैं UTF-8 हूं, तो मैं कह सकता हूं:
"मी, बदले में, मैंने U + 00E1 को 11000011 10100001 के रूप में एन्कोड किया"
और यह स्पष्ट रूप से हर किसी के लिए स्पष्ट है कि हम किस चरित्र का मतलब है।
अब अक्सर उत्पन्न होने वाले भ्रम के लिए
यह सच है कि कभी-कभी एन्कोडिंग का बिट पैटर्न, यदि आप इसे एक द्विआधारी संख्या के रूप में व्याख्या करते हैं, तो इस चरित्र का यूनिकोड कोड बिंदु समान है।
उदाहरण के लिए:
- ASCII encodes एक 1100001, जो आप हेक्साडेसिमल संख्या के रूप में व्याख्या कर सकते हैं के रूप में 0x61 , और के यूनिकोड कोड बिंदु एक है U + 0061 ।
- लैटिन -1 encodes á 11,100,001 है, जो आप के रूप में हेक्साडेसिमल संख्या व्याख्या कर सकते हैं के रूप में 0xE1 , और के यूनिकोड कोड बिंदु á है U + 00E1 ।
बेशक, यह सुविधा के उद्देश्य से इस तरह की व्यवस्था की गई है। लेकिन आपको इसे एक शुद्ध संयोग के रूप में देखना चाहिए । स्मृति में एक चरित्र को दर्शाने के लिए उपयोग किया जाने वाला बिट पैटर्न किसी भी तरह से इस चरित्र के यूनिकोड कोड बिंदु से बंधा नहीं है।
कोई यह भी नहीं कहता है कि आपको 11100001 जैसे एक बिट स्ट्रिंग की व्याख्या बाइनरी नंबर के रूप में करनी होगी। इसे बिट्स के अनुक्रम के रूप में देखें जो लैटिन -1 चरित्र á को एनकोड करने के लिए उपयोग करता है ।
अपने सवाल पर वापस
आपके पायथन दुभाषिया द्वारा उपयोग की जाने वाली एन्कोडिंग UTF-8 है ।
यहाँ आपके उदाहरणों में क्या हो रहा है:
उदाहरण 1
निम्नलिखित UTF-8 में चरित्र á को एन्कोड करता है। यह बिट स्ट्रिंग 11000011 10100001 में परिणाम करता है, जिसे चर में सहेजा जाता है a।
>>> a = 'á'
जब आप aइसके मूल्य को देखते हैं , तो इसकी सामग्री 11000011 10100001 को हेक्स संख्या 0xC3 0xA1 और आउटपुट के रूप में स्वरूपित किया जाता है '\xc3\xa1':
>>> a
'\xc3\xa1'
उदाहरण 2
निम्नलिखित चर में यूआईकोड कोड बिंदु को बचाता है, जो कि U + 00E1 है, चर में ua(हम नहीं जानते कि स्मृति में कोड बिंदु U + 00E1 का प्रतिनिधित्व करने के लिए पायथन आंतरिक रूप से किस डेटा प्रारूप का उपयोग करता है, और यह हमारे लिए महत्वहीन है):
>>> ua = u'á'
जब आप के मूल्य को देखते हैं ua, तो पायथन आपको बताता है कि इसमें कोड बिंदु U + 00E1 है।
>>> ua
u'\xe1'
उदाहरण 3
यूएनएफ -8 के साथ यूनिकोड कोड पॉइंट यू + 00 ई 1 (चरित्र á का प्रतिनिधित्व) निम्नलिखित एनकोड करता है, जिसके परिणामस्वरूप बिट पैटर्न 11000011 10100001 होता है। फिर से, आउटपुट के लिए इस बिट पैटर्न को हेक्स संख्या 0xC3 0xA1 के रूप में दर्शाया जाता है:
>>> ua.encode('utf-8')
'\xc3\xa1'
उदाहरण 4
निम्नलिखित एनकोड कोड लाट -1 के साथ यूनिकोड कोड पॉइंट U + 00E1 (वर्ण á का प्रतिनिधित्व करता है), जिसके परिणामस्वरूप बिट पैटर्न 11100001 है। आउटपुट के लिए, इस बिट पैटर्न को हेक्स संख्या 0xE1 के रूप में दर्शाया गया है, जो कि संयोग से प्रारंभिक के समान है। कोड बिंदु U + 00E1:
>>> ua.encode('latin1')
'\xe1'
यूनिकोड ऑब्जेक्ट uaऔर लैटिन -1 एन्कोडिंग के बीच कोई संबंध नहीं है । Á का कोड बिंदु U + 00E1 है और á का लैटिन -1 एन्कोडिंग 0xE1 है (यदि आप द्विआधारी संख्या के रूप में एन्कोडिंग के बिट पैटर्न की व्याख्या करते हैं) एक शुद्ध संयोग है।
unicode, यह केवल यूनिकोड चरित्र का एक अमूर्त हिस्सा है; कुछ एन्कोडिंग (जैसे ) के साथunicodeपरिवर्तित किया जा सकता है ।strutf-8