2009-01-15 33 views
152

मुझे कभी यकीन नहीं था कि मैं स्ट्र/यूनिकोड डीकोड और एन्कोड के बीच अंतर को समझता हूं।एन्कोड/डीकोड के बीच क्या अंतर है?

मुझे पता है कि str().decode() उस समय के लिए है जब आपके पास बाइट्स की एक स्ट्रिंग है जिसे आप जानते हैं कि एक निश्चित वर्ण एन्कोडिंग है, यह देखते हुए कि एन्कोडिंग नाम यह एक यूनिकोड स्ट्रिंग लौटाएगा।

मुझे पता है कि unicode().encode() किसी दिए गए एन्कोडिंग नाम के अनुसार यूनिकोड वर्णों को बाइट्स की एक स्ट्रिंग में परिवर्तित करता है।

लेकिन मुझे समझ में नहीं आता कि str().encode() और unicode().decode() क्या हैं। क्या कोई भी समझा सकता है, और संभवतः मुझे कुछ और भी सही कर सकता है जिसे मैंने ऊपर गलत पाया है?

संपादित करें:

कई जवाब क्या .encode एक स्ट्रिंग पर करता है के बारे में जानकारी देते हैं, लेकिन कोई पता है कि .decode यूनिकोड के लिए करता है लगता है।

+0

मुझे लगता है कि [इस पृष्ठ] का दूसरा जवाब (http://stackoverflow.com/questions/10288016/usage-of-unicode-and-encode-functions-in-python) पर्याप्त और संक्षेप में स्पष्ट है। – Ben

उत्तर

92

decode यूनिकोड स्ट्रिंग्स की विधि में वास्तव में कोई एप्लिकेशन नहीं है (जब तक कि आपके पास कुछ गैर-टी नहीं है कुछ कारणों से एक यूनिकोड स्ट्रिंग में ext डेटा - नीचे देखें)। यह मुख्य रूप से ऐतिहासिक कारणों से है, मुझे लगता है। पायथन 3 में यह पूरी तरह से चला गया है।

unicode().decode() एक अंतर्निहित एन्कोडिंग s की का उपयोग कर डिफ़ॉल्ट (ascii) कोडेक प्रदर्शन करेंगे। इसे इस प्रकार सत्यापित करें:

>>> s = u'ö' 
>>> s.decode() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0: 
ordinal not in range(128) 

>>> s.encode('ascii') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0: 
ordinal not in range(128) 

त्रुटि संदेश बिल्कुल वही हैं।

str().encode() के लिए यह दूसरी तरह के आसपास है - यह डिफ़ॉल्ट एन्कोडिंग के साथ s का एक अंतर्निहित डिकोडिंग प्रयास करता है:

>>> s = 'ö' 
>>> s.decode('utf-8') 
u'\xf6' 
>>> s.encode() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: 
ordinal not in range(128) 

इस तरह प्रयुक्त, str().encode() भी ज़रूरत से ज़्यादा है।

लेकिन वहाँ उत्तरार्द्ध विधि है कि उपयोगी है की एक और आवेदन है:

>>> s.encode('zip') 
'x\x9c;\xbc\r\x00\x02>\x01z' 
: वहाँ encodings एक सार्थक तरीके से 8 बिट तार करने के लिए लागू किया जा सकता वर्ण सेट से कोई संबंध नहीं है, और इस तरह है कि कर रहे हैं

आप सही हैं, हालांकि: इन दोनों अनुप्रयोगों के लिए "एन्कोडिंग" का अस्पष्ट उपयोग ... अजीब है। फिर, पाइथन 3 में अलग byte और string प्रकारों के साथ, यह अब कोई समस्या नहीं है।

+2

'.decode()' उपयोगी हो सकता है, उदाहरण के लिए, गैर-वर्ण एन्कोडिंग (यानी ज़िप) के उल्लेख के लिए 'प्रिंट यू' \\ u0203'.decode ('यूनिकोड-एस्केप') ' – jfs

+0

+1)। – dotancohen

+0

python3 में अच्छा उदाहरण @ जेएफएसबीस्टियन मुझे लगता है कि आप करेंगे: 'प्रिंट करें' \\ u0203'.encode ('utf8')। डीकोड ('यूनिकोड-एस्केप') ' – AJP

5

कुछ एन्कोडिंग हैं जिनका उपयोग स्ट्र से स्ट्र या यूनिकोड से यूनिकोड तक डी/एन्कोड करने के लिए किया जा सकता है। उदाहरण के लिए बेस 64, हेक्स या यहां तक ​​कि rot13। वे codecs module में सूचीबद्ध हैं।

संपादित करें:

एक यूनिकोड स्ट्रिंग पर डिकोड संदेश इसी एनकोड कार्रवाई को वापस ला सकते हैं:

In [1]: u'0a'.decode('hex') 
Out[1]: '\n' 

लौटे प्रकार यूनिकोड जो मेरी राय में दुर्भाग्यपूर्ण है के बजाय str है। लेकिन जब आप स्ट्र और यूनिकोड के बीच उचित एन-डीकोड नहीं कर रहे हैं तो यह किसी भी तरह की गड़बड़ी की तरह दिखता है।

+1

-1: डीकोड विधि यूनिकोड ऑब्जेक्ट पर लागू नहीं की जा रही है। इसके बजाए, डीकोड ऑपरेशन शुरू होने से पहले, यूनिकोड ऑब्जेक्ट को 'एएससीआई' बायटेस्ट्रिंग के रूप में एन्कोड किया जा रहा है। उस दावे के सबूत के लिए, u'ã'.decode ('हेक्स') आज़माएं - जो यूनिकोड एन्कोडरर – nosklo

+2

@ नोस्क्लो उत्पन्न करता है: आप सही हैं। मेरा वास्तव में क्या मतलब है कि यूनिकोड ऑब्जेक्ट्स में एक डीकोड() विधि है ताकि आप उन्हें गैर-वर्ण-एन्कोडिंग-कोडेक्स भी लागू कर सकें। यह संपूर्ण गैर-वर्ण-एन्कोडिंग-व्यवसाय इस इंटरफ़ेस को पायथन में एक गड़बड़ बनाता है <3. –

12

mybytestring.encode (somecodec) somecodec के इन मूल्यों के लिए सार्थक है:

  • बेस 64
  • BZ2
  • zlib
  • हेक्स
  • quopri
  • ROT13
  • string_escape
  • uu

मुझे यकीन नहीं है कि पहले से ही डीकोड किए गए यूनिकोड टेक्स्ट को डीकोड करने के लिए क्या अच्छा है। ऐसा लगता है कि किसी भी एन्कोडिंग के साथ हमेशा सिस्टम के डिफ़ॉल्ट एन्कोडिंग के साथ एन्कोड करने का प्रयास किया जाता है।

+0

यह अद्भुत है! धन्यवाद। – dotancohen

58

बाइट्स की स्ट्रिंग के रूप में यूनिकोड स्ट्रिंग का प्रतिनिधित्व करने के लिए एन्कोडिंग के रूप में जाना जाता है। u'...'.encode(encoding) का उपयोग करें।

उदाहरण:

 
    >>> u'æøå'.encode('utf8') 
    '\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8\xc3\x83\xc2\xa5' 
    >>> u'æøå'.encode('latin1') 
    '\xc3\xa6\xc3\xb8\xc3\xa5' 
    >>> u'æøå'.encode('ascii') 
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: 
    ordinal not in range(128) 

आप आम तौर पर एक यूनिकोड स्ट्रिंग सांकेतिक शब्दों में बदलना जब भी आप आईओ के लिए इसका इस्तेमाल करने की जरूरत है, उदाहरण के नेटवर्क पर स्थानांतरित करते हैं, या एक डिस्क फ़ाइल में सहेजें के लिए।

बाइट्स की एक स्ट्रिंग को यूनिकोड स्ट्रिंग में कनवर्ट करने के लिए डीकोडिंग के रूप में जाना जाता है। unicode('...', encoding) या '...' का प्रयोग करें।डिकोड (एन्कोडिंग)।

उदाहरण:

 
    >>> u'æøå' 
    u'\xc3\xa6\xc3\xb8\xc3\xa5' # the interpreter prints the unicode object like so 
    >>> unicode('\xc3\xa6\xc3\xb8\xc3\xa5', 'latin1') 
    u'\xc3\xa6\xc3\xb8\xc3\xa5' 
    >>> '\xc3\xa6\xc3\xb8\xc3\xa5'.decode('latin1') 
    u'\xc3\xa6\xc3\xb8\xc3\xa5' 

आप आमतौर पर बाइट्स जब भी आप नेटवर्क से या एक डिस्क फ़ाइल से स्ट्रिंग डेटा प्राप्त की स्ट्रिंग डीकोड।

मेरा मानना ​​है कि अजगर 3 में यूनिकोड से निपटने में कुछ बदलाव देखते हैं, तो इसके बाद के संस्करण शायद अजगर के लिए सही 3.

कुछ अच्छे लिंक नहीं है:

+6

आपने ओपी के सवाल का जवाब नहीं दिया। ओपी जानना चाहता है कि str.encode() और unicode.decode() क्या करें। आपने मूल प्रश्न में जो कहा था उसे दोहराया। – stuckintheshuck

+0

प्रैक्टिस में क्यों आप डीकोडिंग और एन्कोडिंग के साथ गड़बड़ करेंगे के लिए महान जवाब। प्रत्येक मशीन पात्रों के एक ही सेट को समझती नहीं है, लेकिन वे सभी बाइट समझते हैं।एक भाषा कंप्यूटर के लिए बाइट्स में एन्कोड सार्वभौमिक रूप से समझते हैं (और स्थानांतरित या सहेजे जा सकते हैं), लेकिन जब मनुष्यों को वास्तव में उन बाइट्स को पढ़ना पड़ता है (उदाहरण के लिए। क्लाइंट साइड पर)। यूनिकोड स्ट्रिंग पर –

11

anUnicode। एनकोड ('इनकोडिंग') एक स्ट्रिंग वस्तु में परिणाम और एक यूनिकोड वस्तु

aString पर कहा जा सकता है। डिकोड ('एन्कोडिंग') परिणाम यूनिकोड ऑब्जेक्ट में परिणाम दिए गए हैं और दिए गए एन्कोडिंग में एन्कोड किए गए स्ट्रिंग पर कॉल किया जा सकता है।


कुछ और स्पष्टीकरण:

आप कुछ यूनिकोड वस्तु है, जो किसी भी एन्कोडिंग सेट नहीं है बना सकते हैं। मेमोरी में पाइथन द्वारा संग्रहीत किया जाने वाला तरीका आपकी चिंता का कोई भी नहीं है। आप इसे खोज सकते हैं, इसे विभाजित कर सकते हैं और अपनी पसंद के स्ट्रिंग मैनिपुलेटिंग फ़ंक्शन को कॉल कर सकते हैं।

लेकिन एक समय आता है, जब आप अपने यूनिकोड ऑब्जेक्ट को कंसोल या कुछ टेक्स्ट फ़ाइल में प्रिंट करना चाहते हैं। तो आपको एन्कोड करना है (उदाहरण के लिए - यूटीएफ -8 में), आप एन्कोड ('utf-8') को कॉल करते हैं और आपको '\ u < कुछ संख्या >' के साथ एक स्ट्रिंग मिलती है, जो पूरी तरह प्रिंट करने योग्य है।

फिर

, फिर से - आप विपरीत करना चाहते हैं - पढ़ स्ट्रिंग UTF-8 में एन्कोड और एक यूनिकोड के रूप में यह इलाज है, तो \ u360, एक चरित्र नहीं होगा 5. तो फिर तुम डिकोड एक स्ट्रिंग (चयनित एन्कोडिंग के साथ) और यूनिकोड प्रकार के ब्रांड की नई वस्तु प्राप्त करें।

बस एक साइड नोट के रूप में - आप 'ज़िप', 'बेस 64', 'सड़ांध' जैसे कुछ विकृत एन्कोडिंग का चयन कर सकते हैं और उनमें से कुछ स्ट्रिंग से स्ट्रिंग में परिवर्तित हो जाएंगे, लेकिन मेरा मानना ​​है कि सबसे आम मामला यह है कि यूटीएफ -8/यूटीएफ -16 और स्ट्रिंग शामिल है।

0

सरल जवाब यह है कि वे एक दूसरे के बिल्कुल विपरीत हैं।

के वर्णन करने के लिए एक उदाहरण का उपयोग करते हैं:

कंप्यूटर की दुकान है और इस प्रक्रिया के बारे में जानकारी के लिए बाइट की बहुत बुनियादी इकाई का उपयोग करता है, यह मानव आंखों के लिए अर्थहीन है।

उदाहरण के लिए, '\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87' दो चीनी वर्णों का प्रतिनिधित्व है, लेकिन कंप्यूटर केवल जानता है (अर्थ प्रिंट या स्टोर) चीनी अक्षरों को जब उन्हें एक शब्दकोश दिया जाता है उस चीनी शब्द को देखने के लिए, इस मामले में, यह "utf-8" शब्दकोश है, और यदि आप एक अलग या गलत शब्दकोश (एक अलग डिकोडिंग विधि का उपयोग कर) में देखते हैं तो यह इच्छित चीनी शब्द को सही ढंग से दिखाने में विफल रहेगा।

उपर्युक्त मामले में, कंप्यूटर शब्द को चीनी शब्द देखने के लिए प्रक्रिया डीकोडिंग() है।

और कंप्यूटर को कंप्यूटर मेमोरी में लिखने की प्रक्रिया एनकोड() है।

इसलिए एनकोड जानकारी कच्ची बाइट्स है, और डीकोडेड जानकारी कच्चे बाइट्स और संदर्भ के लिए शब्दकोश का नाम है (लेकिन शब्दकोश स्वयं नहीं)।

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