हमेशा यूनिकोड से बाइट्स तक एनकोड करें ।
इस दिशा में, आपको एन्कोडिंग का चयन करना है ।
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
दूसरा तरीका बाइट्स से यूनिकोड तक डिकोड करना है।
इस दिशा में, आपको यह जानना होगा कि एन्कोडिंग क्या है ।
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
इस बिंदु पर पर्याप्त जोर नहीं दिया जा सकता है। यदि आप यूनिकोड "व्हेक-ए-मोल" खेलने से बचना चाहते हैं, तो यह समझना महत्वपूर्ण है कि डेटा स्तर पर क्या हो रहा है। यहाँ यह एक और तरीका बताया गया है:
- एक यूनिकोड ऑब्जेक्ट पहले से ही डीकोड किया गया है, आप कभी भी
decode
उस पर कॉल नहीं करना चाहते हैं ।
- एक बाइटस्ट्रिंग ऑब्जेक्ट पहले से एन्कोडेड है, आप कभी भी
encode
उस पर कॉल नहीं करना चाहते हैं ।
अब, .encode
एक बाइट स्ट्रिंग पर देखने पर, पायथन 2 पहले इसे स्पष्ट रूप से पाठ (एक unicode
वस्तु) में बदलने की कोशिश करता है । इसी तरह, .decode
एक यूनिकोड स्ट्रिंग पर देखने पर, पायथन 2 स्पष्ट रूप से इसे बाइट्स (एक str
वस्तु) में बदलने की कोशिश करता है ।
ये निहितार्थ हैं कि जब आप कॉल करें तो आप क्यों प्राप्त कर सकते हैं । ऐसा इसलिए है क्योंकि एन्कोडिंग आमतौर पर प्रकार के एक पैरामीटर को स्वीकार करता है ; जब एक पैरामीटर प्राप्त होता है , तो एक एन्कोडिंग के साथ इसे फिर से एन्कोडिंग करने से पहले एक ऑब्जेक्ट में एक अंतर्निहित डिकोडिंग होता है । इस रूपांतरण एक डिफ़ॉल्ट 'ascii' विकोडक चुनता † , एक एनकोडर के अंदर आप डिकोडिंग त्रुटि है।Unicode
Decode
Error
encode
unicode
str
unicode
वास्तव में, पायथन 3 में विधियाँ str.decode
और bytes.encode
मौजूद नहीं हैं। इस आम भ्रम से बचने के लिए उनका निष्कासन [विवादास्पद] प्रयास था।
† ... या जो भी कोडिंग sys.getdefaultencoding()
उल्लेख करता है; आमतौर पर यह 'अस्सी' है