Python Language
यूनिकोड और बाइट्स
खोज…
वाक्य - विन्यास
- str.encode (एन्कोडिंग, त्रुटियाँ = 'सख्त')
- बाइट्स। timecode (एन्कोडिंग, त्रुटियाँ = 'सख्त')
- खुला (नाम, मोड, एन्कोडिंग = कोई नहीं)
पैरामीटर
पैरामीटर | विवरण |
---|---|
एन्कोडिंग | उपयोग करने के लिए एन्कोडिंग, उदाहरण के लिए 'ascii' , 'utf8' , आदि ... |
त्रुटियों | त्रुटि मोड, उदाहरण 'replace' वर्ण 'replace' को खराब अक्षरों को बदलने के लिए, 'ignore' करने के लिए बुरे वर्णों को अनदेखा करें, आदि ... |
मूल बातें
पायथन में 3 str
यूनिकोड-सक्षम स्ट्रिंग्स के लिए प्रकार है, जबकि bytes
कच्चे बाइट्स के अनुक्रमों के लिए प्रकार है।
type("f") == type(u"f") # True, <class 'str'>
type(b"f") # <class 'bytes'>
पायथन 2 में एक आकस्मिक स्ट्रिंग डिफ़ॉल्ट रूप से कच्ची बाइट्स का एक क्रम था और यूनिकोड स्ट्रिंग "यू" उपसर्ग के साथ प्रत्येक स्ट्रिंग था।
type("f") == type(b"f") # True, <type 'str'>
type(u"f") # <type 'unicode'>
यूनिकोड को बाइट्स
यूनिकोड के तारों को .encode(encoding)
परिवर्तित किया जा सकता है।
अजगर ३
>>> "£13.55".encode('utf8')
b'\xc2\xa313.55'
>>> "£13.55".encode('utf16')
b'\xff\xfe\xa3\x001\x003\x00.\x005\x005\x00'
अजगर २
py2 में डिफ़ॉल्ट कंसोल एन्कोडिंग sys.getdefaultencoding() == 'ascii'
और py3 में utf-8
नहीं है, इसलिए इसे पिछले उदाहरण के रूप में प्रिंट करना सीधे संभव नहीं है।
>>> print type(u"£13.55".encode('utf8'))
<type 'str'>
>>> print u"£13.55".encode('utf8')
SyntaxError: Non-ASCII character '\xc2' in...
# with encoding set inside a file
# -*- coding: utf-8 -*-
>>> print u"£13.55".encode('utf8')
£13.55
यदि एन्कोडिंग स्ट्रिंग को संभाल नहीं सकता है, तो एक 'यूनिकोडएकोडकोड' उठाया जाता है:
>>> "£13.55".encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 0: ordinal not in range(128)
यूनिकोड को बाइट करता है
बाइट्स को .decode(encoding)
साथ यूनिकोड स्ट्रिंग्स में परिवर्तित किया जा सकता है।
बाइट्स का एक क्रम केवल उचित एन्कोडिंग के माध्यम से एक यूनिकोड स्ट्रिंग में परिवर्तित किया जा सकता है!
>>> b'\xc2\xa313.55'.decode('utf8')
'£13.55'
यदि एन्कोडिंग स्ट्रिंग को संभाल नहीं सकता है, तो एक UnicodeDecodeError
उठाया जाता है:
>>> b'\xc2\xa313.55'.decode('utf16')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/csaftoiu/csaftoiu-github/yahoo-groups-backup/.virtualenv/bin/../lib/python3.5/encodings/utf_16.py", line 16, in decode
return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x35 in position 6: truncated data
एन्कोडिंग / डिकोडिंग त्रुटि हैंडलिंग
.encode
और .decode
दोनों में त्रुटि मोड हैं।
डिफ़ॉल्ट 'strict'
, जो त्रुटि पर अपवाद उठाता है। अन्य मोड अधिक क्षमाशील हैं।
एन्कोडिंग
>>> "£13.55".encode('ascii', errors='replace')
b'?13.55'
>>> "£13.55".encode('ascii', errors='ignore')
b'13.55'
>>> "£13.55".encode('ascii', errors='namereplace')
b'\\N{POUND SIGN}13.55'
>>> "£13.55".encode('ascii', errors='xmlcharrefreplace')
b'£13.55'
>>> "£13.55".encode('ascii', errors='backslashreplace')
b'\\xa313.55'
डिकोडिंग
>>> b = "£13.55".encode('utf8')
>>> b.decode('ascii', errors='replace')
'��13.55'
>>> b.decode('ascii', errors='ignore')
'13.55'
>>> b.decode('ascii', errors='backslashreplace')
'\\xc2\\xa313.55'
हौसला
ऊपर से स्पष्ट है कि यूनिकोड और बाइट्स के साथ काम करते समय अपने एन्कोडिंग को सीधा रखना महत्वपूर्ण है।
फ़ाइल I / O
गैर-बाइनरी मोड में खोली गई फाइलें (जैसे 'r'
या 'w'
) तार के साथ सौदा करती हैं। बधिर एन्कोडिंग 'utf8'
।
open(fn, mode='r') # opens file for reading in utf8
open(fn, mode='r', encoding='utf16') # opens file for reading utf16
# ERROR: cannot write bytes when a string is expected:
open("foo.txt", "w").write(b"foo")
बाइनरी मोड में खोली गई फाइलें (जैसे 'rb'
या 'wb'
) बाइट्स के साथ सौदा करती हैं। कोई एन्कोडिंग तर्क निर्दिष्ट नहीं किया जा सकता है क्योंकि कोई एन्कोडिंग नहीं है।
open(fn, mode='wb') # open file for writing bytes
# ERROR: cannot write string when bytes is expected:
open(fn, mode='wb').write("hi")