2016-02-26 6 views
5

मुझे यूनिकोड, एन्कोडिंग और डिकोडिंग के बारे में बात मिली। लेकिन मुझे समझ में नहीं आता कि एन्कोड फ़ंक्शन स्ट्र प्रकार पर क्यों काम करता है। मुझे उम्मीद है कि यह केवल यूनिकोड प्रकार पर काम करेगी। इसलिए मेरा सवाल यह है कि जब यह यूनिकोड की बजाय स्ट्र पर उपयोग किया जाता है तो एन्कोड का व्यवहार क्या होता है?क्या होता है जब स्ट्रिंग में स्ट्रिंग पर एन्कोड का उपयोग किया जाता है?

+0

एन्कोड और डीकोड किए जाने पर यूनिकोड के साथ आपको क्या लगता है? – kojiro

+2

पायथन 3 का उपयोग करें और अधिकांश भ्रम समाप्त हो जाएगा। – Kupiakos

उत्तर

5

पायथन 2 में दो प्रकार के कोडेक उपलब्ध हैं; वे जो str और unicode के बीच परिवर्तित होते हैं, और जो str से str में परिवर्तित होते हैं। उत्तरार्द्ध के उदाहरण base64 और rot13 कोडेक्स हैं।

str.encode() विधि का समर्थन करने के लिए मौजूद है उत्तरार्द्ध:

'binary data'.encode('base64') 

लेकिन अब है कि यह मौजूद है, लोगों को भी unicode के लिए प्रयोग कर रहे हैं ->str कोडेक; एन्कोडिंग केवल unicode से str (और दूसरी तरफ डीकोडिंग) से जा सकती है। इनका समर्थन करने के लिए, पाइथन निहित अंततः एन्कोडिंग से पहले, ASCII कोडेक का उपयोग करके str मान unicode पर डीकोड करेगा।

संयोग से, जब एक str का उपयोग कर - एक unicode वस्तु पर>str कोडेक, अजगर पहले परोक्ष str के लिए एक ही ASCII कोडेक का उपयोग कर encodes।

अजगर 3 में, यह एक के द्वारा हल किया गया है) bytes.encode() और str.decode() तरीकों को हटाने (याद रखें कि bytes sorta वर्ष str और str नई unicode) है, और ख) str ले जाकर - करने के लिए>str एनकोडिंग codecs मॉड्यूल , codecs.encode() और codecs.decode() फ़ंक्शंस का उपयोग करके।उसी प्रकार के बीच कौन से कोडेक्स बदलते हैं उन्हें भी स्पष्ट और अद्यतन किया गया है, Python Specific Encodings section देखें; ध्यान दें कि 'टेक्स्ट' एन्कोडिंग वहां उल्लेखनीय है, जहां पाइथन 2 में उपलब्ध है, इसके बजाय str पर एन्कोड करें।

+0

आपके उत्तर के लिए धन्यवाद। इसके अलावा मुझे बेस 64 और rot13 के बारे में पता नहीं था! – Kowalsy

4

पायथन को पता चलता है कि यह encodestr प्रकार पर नहीं कर सकता है, इसलिए यह पहले decode पर कोशिश करता है! यह 'ascii' कोडेक का उपयोग करता है, जो 0x7f से ऊपर कोडपॉइंट वाले कोई भी वर्ण होने पर विफल हो जाएगा।

यही कारण है कि आप कभी-कभी decode त्रुटि को देखते हैं जब आप encode करने का प्रयास कर रहे थे।

+0

नाइटपिक: यह 'sys.getdefaultencoding()' (जो लगभग हमेशा 'ascii'') का उपयोग करता है – wim

+0

@wim इसके लिए धन्यवाद, मुझे यह नहीं पता था - मैंने कभी भी sysgetdefaultencoding' को कुछ भी नहीं देखा है 'ascii' से। –

+0

@MarkRansom: ऐसा इसलिए है क्योंकि 'sys.setdefaultencoding' को '.py.py' द्वारा हटा दिया गया है। 'रीलोड (सीईएस)' इसे वापस लाएगा, लेकिन डिफ़ॉल्ट रूप से कुछ भी सेट कर रहा है लेकिन 'ascii' एक [* बहुत बुरा विचार *] है (https://stackoverflow.com/questions/28657010/dangers-of-sys-setdefaultencodingutf -8)। आप अक्सर 'आयात sys देखते हैं; (सिस) को फिर से लोड; sys.setdefaultencoding (...) 'यूनिकोड समस्याओं के बारे में प्रश्नों पर कार्गो-पंथ। –

3

पायथन 3 में, एक बाइटस्ट्रिंग एन्कोडिंग बस काम नहीं करता है।

>>> b'hi'.encode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'bytes' object has no attribute 'encode' 

अजगर 2 की कोशिश करता सहायक हो जब तुम डिकोडsys.getdefaultencoding() (आमतौर पर ascii) के साथ स्ट्रिंग और बाद में यह एनकोड करने के लिए एक str और पहले के प्रयासों में वे encode कहते हैं।

यही कारण है कि आपको अजीब त्रुटि संदेश मिलता है कि जब आप utf-8 के साथ एन्कोड करने का प्रयास करते हैं तो एसीआईआई के साथ डिकोडिंग संभव नहीं है।

>>> 'hi\xFF'.encode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 2: ordinal not in range(128) 

नेड बताते हैं यह बेहतर रहा से, आगे 16:20 से this देखते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे