python - एक बी स्ट्रिंग के सामने 'बी' चरित्र क्या करता है?




string unicode (4)

दूसरों ने जो कहा है उसके अलावा, ध्यान दें कि यूनिकोड में एक वर्ण में कई बाइट्स हो सकते हैं

जिस तरह से यूनिकोड काम करता है वह यह है कि यह पुराने ASCII प्रारूप (7-बिट कोड जो 0xxx xxxx जैसा दिखता है) लिया और बहु-बाइट अनुक्रम जोड़े जहां सभी बाइट्स एएससीआईआई से परे वर्णों का प्रतिनिधित्व करने के लिए 1 (1xxx xxxx) से शुरू होते हैं ताकि यूनिकोड backwards-compatible ASCII के साथ backwards-compatible

>>> len('Öl')  # German word for 'oil' with 2 characters
2
>>> 'Öl'.encode('UTF-8')  # convert str to bytes 
b'\xc3\x96l'
>>> len('Öl'.encode('UTF-8'))  # 3 bytes encode 2 characters !
3

जाहिर है, निम्नलिखित वैध वाक्यविन्यास है

my_string = b'The string'

मैं जानना चाहता हूँ:

  1. स्ट्रिंग के सामने यह b चरित्र क्या है?
  2. इसका उपयोग करने के प्रभाव क्या हैं?
  3. इसका उपयोग करने के लिए उचित स्थितियां क्या हैं?

मुझे एसओ पर एक संबंधित प्रश्न मिला है, लेकिन यह प्रश्न PHP के बारे में है, और यह कहता है कि b को इंगित करने के लिए प्रयोग किया जाता है कि स्ट्रिंग बाइनरी है, यूनिकोड के विपरीत, जिसे PHP के संस्करण से संगत होने के लिए कोड की आवश्यकता थी < 6, PHP 6 पर माइग्रेट करते समय मुझे नहीं लगता कि यह पायथन पर लागू होता है।

यूनिकोड के रूप में एक स्ट्रिंग निर्दिष्ट करने के लिए मुझे उसी वाक्यविन्यास में u वर्ण का उपयोग करने के बारे में पाइथन साइट पर यह दस्तावेज़ मिला। दुर्भाग्य से, यह उस दस्तावेज़ में कहीं भी बी चरित्र का उल्लेख नहीं करता है।

इसके अलावा, जिज्ञासा से बाहर, क्या b और u तुलना में अधिक प्रतीकों u जो अन्य चीजें करते हैं?


बी एक बाइट स्ट्रिंग इंगित करता है।

बाइट वास्तविक डेटा हैं। स्ट्रिंग्स एक अमूर्त हैं।

यदि आपके पास बहु-चरित्र स्ट्रिंग ऑब्जेक्ट था और आपने एक सिंगल कैरेक्टर लिया था, तो यह एक स्ट्रिंग होगा, और यह एन्कोडिंग के आधार पर आकार में 1 से अधिक बाइट हो सकता है।

यदि बाइट स्ट्रिंग के साथ 1 बाइट लिया गया है, तो आपको 0-255 से एक एकल 8-बिट मान मिलेगा और यदि यह एन्कोडिंग के कारण वाले वर्ण> 1 बाइट थे तो यह एक पूर्ण वर्ण का प्रतिनिधित्व नहीं कर सकता है।

टीबीएच मैं तारों का उपयोग करता हूं जब तक कि मेरे पास बाइट्स का उपयोग करने के लिए कुछ विशिष्ट निम्न स्तर का कारण न हो।


यहां एक उदाहरण दिया गया है जहां 'बी' की अनुपस्थिति Python 3.x में TypeError अपवाद फेंक देगी

>>> f=open("new", "wb")
>>> f.write("Hello Python!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface

'बी' उपसर्ग जोड़ना समस्या को ठीक करेगा।


पायथन 3.x प्रकारों के बीच स्पष्ट अंतर बनाता है:

  • str = '...' literal = यूनिकोड वर्णों का एक अनुक्रम (यूटीएफ -16 या यूटीएफ -32, पाइथन को संकलित करने के तरीके के आधार पर)
  • bytes = b'...' अक्षर = ऑक्टेट्स का अनुक्रम (0 और 255 के बीच पूर्णांक)

यदि आप जावा या सी # से परिचित हैं, तो String और bytes को byte[] रूप में str बारे में सोचें। यदि आप एसक्यूएल से परिचित हैं, तो NVARCHAR और bytes को NVARCHAR या BLOB रूप में NVARCHAR । यदि आप Windows रजिस्ट्री से परिचित हैं, तो REG_SZ और bytes को REG_BINARY रूप में str बारे में सोचें। यदि आप सी (++) से परिचित हैं, तो char और तारों के बारे में आपने जो कुछ सीखा है उसे भूल जाएं, क्योंकि एक चरित्र बीईटीई नहीं है । वह विचार लंबे अप्रचलित है।

जब आप टेक्स्ट का प्रतिनिधित्व करना चाहते हैं तो आप str उपयोग करते हैं।

print('שלום עולם')

जब आप निम्न स्तर के बाइनरी डेटा जैसे structs का प्रतिनिधित्व करना चाहते हैं तो आप bytes उपयोग करते हैं।

NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]

आप एक bytes ऑब्जेक्ट में एक str को encode कर सकते हैं।

>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'

और आप एक bytes को एक str में डीकोड कर सकते हैं।

>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'

लेकिन आप दो प्रकारों को स्वतंत्र रूप से मिश्रण नहीं कर सकते हैं।

>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str

b'...' नोटेशन कुछ हद तक भ्रमित है कि यह बाइट 0x01-0x7F को हेक्स संख्याओं के बजाय ASCII वर्णों के साथ निर्दिष्ट करने की अनुमति देता है।

>>> b'A' == b'\x41'
True

लेकिन मुझे ज़ोर देना चाहिए, एक चरित्र बाइट नहीं है

>>> 'A' == b'A'
False

पायथन 2.x में

पायथन के प्री-3.0 संस्करणों में टेक्स्ट और बाइनरी डेटा के बीच इस प्रकार का अंतर था। इसके बजाए, वहां था:

  • unicode = u'...' अक्षर = यूनिकोड वर्णों का अनुक्रम = 3.x str
  • str = '...' literal = confounded बाइट / अक्षर के अनुक्रम
    • आमतौर पर पाठ, कुछ अनिर्दिष्ट एन्कोडिंग में एन्कोड किया गया।
    • लेकिन struct.pack आउटपुट जैसे बाइनरी डेटा का प्रतिनिधित्व करने के लिए भी प्रयोग किया जाता है।

2.x-to-3.x संक्रमण को कम करने के लिए, b'...' शाब्दिक वाक्यविन्यास को पाइथन 2.6 पर बैकपोर्ट किया गया था, ताकि बाइनरी स्ट्रिंग्स (जिसे 3.x में bytes होना चाहिए) को टेक्स्ट से अलग करने की अनुमति दी जा सके। तार (जो 3.x में str होना चाहिए)। b उपसर्ग 2.x में कुछ भी नहीं करता है, लेकिन 2to3 स्क्रिप्ट को इसे यूनिकोड स्ट्रिंग में 3.x में परिवर्तित करने के लिए नहीं कहता है।

तो हाँ, पाइथन में b'...' अक्षर एक ही उद्देश्य है कि वे PHP में करते हैं।

इसके अलावा, जिज्ञासा से बाहर, क्या बी और यू की तुलना में अधिक प्रतीकों हैं जो अन्य चीजें करते हैं?

r उपसर्ग एक कच्ची स्ट्रिंग बनाता है (उदाहरण के लिए, r'\t' एक टैब के बजाय बैकस्लैश + t ), और ट्रिपल कोट्स '''...''' या """...""" मल्टी लाइन स्ट्रिंग अक्षर।







binary