जवाबों:
पायथन 3 को मान लेना (पायथन 2 में, यह अंतर थोड़ा कम अच्छी तरह से परिभाषित है) - एक स्ट्रिंग वर्णों का एक अनुक्रम है, अर्थात यूनिकोड कोडप्वाइंट ; ये एक अमूर्त अवधारणा हैं, और इसे सीधे डिस्क पर संग्रहीत नहीं किया जा सकता है। एक बाइट स्ट्रिंग एक क्रम है, अनिश्चित रूप से, बाइट्स - चीजें जो डिस्क पर संग्रहीत की जा सकती हैं। उनके बीच की मैपिंग एक एन्कोडिंग है - इनमें से बहुत सारे हैं (और अनन्त रूप से कई संभव हैं) - और आपको यह जानना होगा कि रूपांतरण करने के लिए विशेष मामले में कौन सा लागू होता है, क्योंकि एक अलग एन्कोडिंग एक ही बाइट्स को मैप कर सकता है एक अलग स्ट्रिंग के लिए:
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'
एक बार जब आप जानते हैं कि किसका उपयोग करना है, तो आप .decode()
बाइट स्ट्रिंग की विधि का उपयोग करके इसे ऊपर से सही वर्ण स्ट्रिंग प्राप्त कर सकते हैं। पूर्णता के लिए, .encode()
वर्ण स्ट्रिंग की विधि विपरीत तरीके से जाती है:
>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
str
वस्तुओं का इन-मेमोरी प्रतिनिधित्व पायथन पक्ष से सुलभ या प्रासंगिक नहीं है; डेटा संरचना कोडपॉइंट्स का सिर्फ एक अनुक्रम है। पीईपी 393 के तहत , सटीक आंतरिक एन्कोडिंग लैटिन -1, यूसीएस 2 या यूसीएस 4 में से एक है, और एक यूटीएफ -8 प्रतिनिधित्व को पहले अनुरोध के बाद कैश किया जा सकता है, लेकिन यहां तक कि सी कोड को इन आंतरिक विवरणों पर भरोसा करने से हतोत्साहित किया जाता है।
केवल एक चीज जिसे कंप्यूटर स्टोर कर सकता है वह है बाइट्स।
कंप्यूटर में किसी भी चीज़ को स्टोर करने के लिए, आपको पहले उसे एनकोड करना होगा , यानी उसे बाइट्स में बदलना होगा। उदाहरण के लिए:
MP3
, WAV
आदिPNG
, JPEG
आदिASCII
, UTF-8
आदिMP3
, WAV
, PNG
, JPEG
, ASCII
और UTF-8
के उदाहरण हैं एन्कोडिंग । एन्कोडिंग बाइट्स में ऑडियो, इमेज, टेक्स्ट आदि को दर्शाने का एक प्रारूप है।
पायथन में, एक बाइट स्ट्रिंग बस है: बाइट्स का एक क्रम। यह मानव-पठनीय नहीं है। हुड के तहत, कंप्यूटर में संग्रहीत होने से पहले सब कुछ बाइट स्ट्रिंग में परिवर्तित होना चाहिए।
दूसरी ओर, एक चरित्र स्ट्रिंग, जिसे अक्सर सिर्फ "स्ट्रिंग" कहा जाता है, पात्रों का एक क्रम है। यह मानव-पठनीय है। एक चरित्र स्ट्रिंग को सीधे कंप्यूटर में संग्रहीत नहीं किया जा सकता है, इसे पहले एनकोड करना होगा (बाइट स्ट्रिंग में परिवर्तित)। ऐसे कई एनकोडिंग हैं जिनके माध्यम से एक चरित्र स्ट्रिंग को बाइट स्ट्रिंग में परिवर्तित किया जा सकता है, जैसे ASCII
और UTF-8
।
'I am a string'.encode('ASCII')
उपरोक्त पायथन कोड 'I am a string'
एन्कोडिंग का उपयोग करके स्ट्रिंग को एन्कोड करेगा ASCII
। उपरोक्त कोड का परिणाम एक बाइट स्ट्रिंग होगा। यदि आप इसे प्रिंट करते हैं, तो पायथन इसका प्रतिनिधित्व करेगा b'I am a string'
। हालांकि, याद रखें कि बाइट स्ट्रिंग्स मानव-पठनीय नहीं हैं , यह सिर्फ इतना है कि ASCII
जब आप उन्हें प्रिंट करते हैं तो पायथन उन्हें डिकोड करता है। पायथन में, एक बाइट स्ट्रिंग का प्रतिनिधित्व किया जाता है b
, इसके बाद बाइट स्ट्रिंग का ASCII
प्रतिनिधित्व होता है।
एक बाइट स्ट्रिंग को एक वर्ण स्ट्रिंग में वापस डिकोड किया जा सकता है , अगर आपको पता है कि एन्कोडिंग जो इसे एन्कोड करने के लिए उपयोग किया गया था।
b'I am a string'.decode('ASCII')
उपरोक्त कोड मूल स्ट्रिंग लौटाएगा 'I am a string'
।
एन्कोडिंग और डिकोडिंग उलटा संचालन हैं। डिस्क पर लिखे जाने से पहले सब कुछ एन्कोड किया जाना चाहिए, और इसे मानव द्वारा पढ़ा जा सकने से पहले इसे डिकोड किया जाना चाहिए।
नोट: मैं पायथन 3 के लिए अपने उत्तर को अधिक विस्तृत करूंगा क्योंकि पायथन 2 के जीवन का अंत बहुत करीब है।
पायथन 3 में
bytes
8-बिट अहस्ताक्षरित मानों str
के अनुक्रम होते हैं , जबकि यूनिकोड कोड बिंदुओं के अनुक्रम होते हैं जो मानव भाषाओं से पाठ वर्णों का प्रतिनिधित्व करते हैं।
>>> # bytes
>>> b = b'h\x65llo'
>>> type(b)
<class 'bytes'>
>>> list(b)
[104, 101, 108, 108, 111]
>>> print(b)
b'hello'
>>>
>>> # str
>>> s = 'nai\u0308ve'
>>> type(s)
<class 'str'>
>>> list(s)
['n', 'a', 'i', '̈', 'v', 'e']
>>> print(s)
naïve
भले ही bytes
और str
एक ही तरह से काम करने के लिए लगता है, उनके उदाहरण एक दूसरे के साथ संगत नहीं हैं, यानी, bytes
और str
उदाहरणों को ऑपरेटरों के साथ मिलकर उपयोग नहीं किया जा सकता है >
और +
। इसके अलावा, ध्यान रखें कि समानता के लिए तुलना bytes
और str
उदाहरण, का उपयोग करते हुए ==
, हमेशा मूल्यांकन करेंगे False
यहां तक कि जब वे बिल्कुल समान वर्ण होते हैं।
>>> # concatenation
>>> b'hi' + b'bye' # this is possible
b'hibye'
>>> 'hi' + 'bye' # this is also possible
'hibye'
>>> b'hi' + 'bye' # this will fail
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat str to bytes
>>> 'hi' + b'bye' # this will also fail
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "bytes") to str
>>>
>>> # comparison
>>> b'red' > b'blue' # this is possible
True
>>> 'red'> 'blue' # this is also possible
True
>>> b'red' > 'blue' # you can't compare bytes with str
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'bytes' and 'str'
>>> 'red' > b'blue' # you can't compare str with bytes
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'str' and 'bytes'
>>> b'blue' == 'red' # equality between str and bytes always evaluates to False
False
>>> b'blue' == 'blue' # equality between str and bytes always evaluates to False
False
किसी अन्य समस्या से निपटने के दौरान bytes
और str
मौजूद फाइलों के साथ काम करते समय मौजूद है जो open
बिल्ट-इन फ़ंक्शन का उपयोग करके लौटाए जाते हैं । एक तरफ, यदि आप किसी फ़ाइल से / के लिए बाइनरी डेटा को ओटी पढ़ना या लिखना चाहते हैं, तो हमेशा बाइनरी मोड जैसे 'आरबी' या 'डब्ल्यूबी' का उपयोग करके फ़ाइल खोलें। दूसरी ओर, यदि आप किसी फ़ाइल से / तक यूनिकोड डेटा पढ़ना या लिखना चाहते हैं, तो अपने कंप्यूटर की डिफ़ॉल्ट एन्कोडिंग के बारे में जानकारी रखें, इसलिए यदि आवश्यक हो तो encoding
आश्चर्य से बचने के लिए पैरामीटर पास करें ।
अजगर 2 में
str
8-बिट वैल्यूज़ unicode
के सीक्वेंस होते हैं , जबकि यूनिकोड के कैरेक्टर्स के सीक्वेंस होते हैं। ध्यान में रखने की एक बात यह है कि str
और unicode
ऑपरेटरों के साथ इस्तेमाल किया जा सकता है, तो str
केवल 7 बिट एएससीआई वर्ण होते हैं।
यह सहायक कार्यों का उपयोग करने के लिए के बीच परिवर्तित करने के लिए उपयोगी हो सकता है str
और unicode
अजगर 2 में, और के बीच bytes
और str
अजगर 3 में।
से यूनिकोड क्या है :
मौलिक रूप से, कंप्यूटर केवल संख्याओं से निपटते हैं। वे हर एक के लिए एक नंबर निर्दिष्ट करके अक्षर और अन्य वर्ण संग्रहीत करते हैं।
......
यूनिकोड हर चरित्र के लिए एक विशिष्ट संख्या प्रदान करता है, चाहे कोई भी मंच हो, चाहे वह कोई भी कार्यक्रम हो, चाहे वह कोई भी भाषा हो।
इसलिए जब एक कंप्यूटर एक स्ट्रिंग का प्रतिनिधित्व करता है, तो यह स्ट्रिंग के कंप्यूटर में उनके अद्वितीय यूनिकोड नंबर के माध्यम से संग्रहीत वर्णों को पाता है और इन आंकड़ों को मेमोरी में संग्रहीत किया जाता है। लेकिन आप स्ट्रिंग को डिस्क पर सीधे लिखने या उनके यूनिकोड नंबर के माध्यम से नेटवर्क पर प्रसारित करने के लिए नहीं लिख सकते हैं क्योंकि ये आंकड़े केवल साधारण दशमलव संख्या हैं। आपको स्ट्रिंग को बाइट स्ट्रिंग में सांकेतिक शब्दों में बदलना चाहिए, जैसे कि UTF-8
। UTF-8
एक वर्ण एन्कोडिंग है जो सभी संभावित वर्णों को एन्कोडिंग करने में सक्षम है और यह वर्णों को बाइट्स के रूप में संग्रहीत करता है (यह इस तरह दिखता है )। तो एन्कोडेड स्ट्रिंग को हर जगह इस्तेमाल किया जा सकता है क्योंकि हर जगह UTF-8
लगभग समर्थित है। जब आप कोई पाठ फ़ाइल खोलते हैं, तो उसमें एन्कोड किया गया होता हैUTF-8
अन्य प्रणालियों से, आपका कंप्यूटर इसे डिकोड करेगा और अपने विशिष्ट यूनिकोड नंबर के माध्यम से इसमें वर्ण प्रदर्शित करेगा। जब कोई ब्राउज़र UTF-8
नेटवर्क से एन्कोडेड स्ट्रिंग डेटा प्राप्त करता है , तो यह डेटा को स्ट्रिंग ( UTF-8
एन्कोडिंग में ब्राउज़र को मान लेना ) को डिकोड करेगा और स्ट्रिंग प्रदर्शित करेगा।
Python3 में, आप स्ट्रिंग और बाइट स्ट्रिंग को एक दूसरे में बदल सकते हैं:
>>> print('中文'.encode('utf-8'))
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
中文
एक शब्द में, स्ट्रिंग को कंप्यूटर पर पढ़ने के लिए मनुष्यों को प्रदर्शित करने के लिए है और बाइट स्ट्रिंग डिस्क और डेटा ट्रांसमिशन के लिए भंडारण के लिए है।
यूनिकोड वर्णों के द्विआधारी निरूपण और विभिन्न प्रकार के स्वरूपण (जैसे लोअर केस / अपर केस, नई लाइन, कैरिज रिटर्न), और अन्य "चीजों" (जैसे इमोजीस) के लिए एक सहमत-प्रारूप प्रारूप है। एक कंप्यूटर यूनिकोड प्रतिनिधित्व (बिट्स की एक श्रृंखला) को संग्रहित करने में कम सक्षम नहीं है, चाहे वह मेमोरी में या किसी फ़ाइल में हो, जैसे कि वह आस्की प्रतिनिधित्व (बिट्स की एक अलग श्रृंखला), या किसी अन्य प्रतिनिधित्व (बिट्स की श्रृंखला) को संग्रहीत करने से है। )।
संचार के लिए संचार के लिए, पार्टियों को इस बात पर सहमत होना चाहिए कि प्रतिनिधित्व का क्या उपयोग किया जाएगा।
क्योंकि यूनिकोड अंतर-मानव और अंतर-कंप्यूटर संचार में उपयोग किए जाने वाले सभी संभावित पात्रों (और अन्य "चीजों") का प्रतिनिधित्व करना चाहता है , इसके लिए प्रतिनिधित्व की अन्य प्रणालियों की तुलना में कई पात्रों (या चीजों) के प्रतिनिधित्व के लिए अधिक से अधिक बिट्स की आवश्यकता होती है जो पात्रों / चीजों के अधिक सीमित सेट का प्रतिनिधित्व करना चाहते हैं। "सरल बनाने," और शायद ऐतिहासिक उपयोग को समायोजित करने के लिए, यूनिकोड प्रतिनिधित्व लगभग विशेष रूप से फ़ाइलों के पात्रों के भंडारण के उद्देश्य के लिए प्रतिनिधित्व (जैसे एससीआई) की किसी अन्य प्रणाली में परिवर्तित हो जाता है।
यह मामला है कि यूनिकोड नहीं है नहीं कर सकते हैं फ़ाइलों में पात्रों के भंडारण, या के माध्यम से उन्हें संचारित करने के लिए इस्तेमाल किया जा किसी भी संचार चैनल के लिए, बस यह है कि यह है नहीं।
शब्द "स्ट्रिंग," ठीक से परिभाषित नहीं है। "स्ट्रिंग," अपने सामान्य उपयोग में, वर्णों / चीजों के एक सेट को संदर्भित करता है। एक कंप्यूटर में, उन पात्रों को कई अलग-अलग बिट-बाय-बिट अभ्यावेदन में से किसी एक में संग्रहीत किया जा सकता है। "बाइट स्ट्रिंग" एक प्रतिनिधित्व का उपयोग करके संग्रहीत वर्णों का एक सेट है जो आठ बिट्स (आठ बिट्स को बाइट के रूप में संदर्भित किया जाता है) का उपयोग करता है। चूंकि, इन दिनों, कंप्यूटर यूनिकोड सिस्टम (बाइट्स की एक वेरिएबल संख्या द्वारा दर्शाए गए वर्ण) का उपयोग मेमोरी में कैरेक्टर को स्टोर करने के लिए करते हैं, और बाइट स्ट्रिंग्स (सिंगल बाइट्स द्वारा दर्शाए गए कैरेक्टर) को कैरेक्टर्स को फाइलों में स्टोर करने के लिए, एक कैरेक्टर का प्रतिनिधित्व करने से पहले रूपांतरण का उपयोग करना चाहिए। स्मृति में फ़ाइलों में भंडारण में ले जाया जाएगा।
चलो एक सरल एक-वर्ण स्ट्रिंग है 'š'
और इसे बाइट्स के अनुक्रम में एनकोड करते हैं:
>>> 'š'.encode('utf-8')
b'\xc5\xa1'
इस उदाहरण के प्रयोजन के लिए आइए बाइट्स के अनुक्रम को अपने द्विआधारी रूप में प्रदर्शित करें:
>>> bin(int(b'\xc5\xa1'.hex(), 16))
'0b1100010110100001'
अब आम तौर पर जानकारी को डिकोड करना संभव नहीं है बिना यह जाने कि यह कैसे एनकोड किया गया था। केवल अगर आप जानते हैं कि utf-8
पाठ एन्कोडिंग का उपयोग किया गया था, तो आप utf-8 को डिकोड करने के लिए एल्गोरिथ्म का पालन कर सकते हैं और मूल स्ट्रिंग प्राप्त कर सकते हैं:
11000101 10100001
^^^^^ ^^^^^^
00101 100001
आप बाइनरी नंबर 101100001
को एक स्ट्रिंग के रूप में प्रदर्शित कर सकते हैं :
>>> chr(int('101100001', 2))
'š'
पायथन भाषाओं में शामिल हैं str
और bytes
मानक "अंतर्निहित प्रकार" के रूप में। दूसरे शब्दों में, वे दोनों वर्ग हैं। मुझे नहीं लगता कि यह सार्थक है कि पायथन को इस तरह क्यों लागू किया गया है।
कहा जा रहा है कि, str
और bytes
एक दूसरे के समान हैं। दोनों एक ही तरीके से अधिकांश साझा करते हैं। निम्न विधियाँ str
कक्षा के लिए अद्वितीय हैं :
casefold
encode
format
format_map
isdecimal
isidentifier
isnumeric
isprintable
निम्न विधियाँ bytes
कक्षा के लिए अद्वितीय हैं :
decode
fromhex
hex
str
प्रकार समान हैbytes
; यह उत्तर समान रूप सेunicode
प्रकार की तुलना करता है (पायथन 3 में मौजूद नहीं है)str
।