2010-07-20 12 views
9

मैं एक पायथन स्ट्रिंग एन्कोड करना चाहता था और हेब्रू तारों के साथ अपवाद प्राप्त करना चाहता था। मैं इसे ठीक नहीं कर सका और कुछ अनुमान उन्मुख प्रोग्रामिंग करना शुरू कर दिया। अंत में, यूआरएल एन्कोडर को भेजने से पहले mystr = mystr.encode("utf8") कर दिन को बचाया।पायथन: "..." एनकोड ("utf8") क्या ठीक करता है?

क्या कोई समझा सकता है कि क्या हुआ? .encode ("utf8") क्या करता है? मेरी मूल स्ट्रिंग वैसे भी एक यूनिकोड स्ट्रिंग थी (यानी आप द्वारा prefixed)।

+9

यह प्रत्यक्ष एवर नहीं है, लेकिन यह पाठ एक पढ़ने योग्य है: [पूर्ण न्यूनतम सॉफ्टवेयर डेवलपर बिल्कुल, यूनिकोड और कैरेक्टर सेट्स (कोई बहाना नहीं है!) के बारे में जानना चाहिए (http: //www.joelonsoftware। कॉम/लेख/यूनिकोड.html) जोएल स्पॉस्की – balpha

+8

अनुमान-आधारित प्रोग्रामिंग द्वारा। अब यह एक लोकप्रिय प्रतिमान है :) – Amnon

+0

मूलभूत बातें सीखने के अपने अनुभव में (जैसे आप यहां कर रहे हैं) अधिक प्रभावी है। – Amnon

उत्तर

9

आप मूल स्ट्रिंग एक यूनिकोड ऑब्जेक्ट था जिसमें कच्चे Unicode कोड पॉइंट थे, इसे यूटीएफ -8 के रूप में एन्कोड करने के बाद यह एक सामान्य बाइट स्ट्रिंग है जिसमें UTF-8 एन्कोडेड डेटा होता है।

यूआरएल एन्कोडर एक बाइट स्ट्रिंग की अपेक्षा करता है, ताकि यह एक बाइट को दूसरे के बाद यूआरएल-एन्कोड कर सके और यूनिकोड कोड पॉइंट से निपटने की आवश्यकता न हो। जब आप इसे एक यूनिकोड ऑब्जेक्ट देते हैं, तो यह कुछ डिफ़ॉल्ट एन्कोडिंग, शायद ASCII का उपयोग करके इसे बाइट स्ट्रिंग में परिवर्तित करने का प्रयास करता है। हिब्रू वर्णों के लिए जिन्हें ASCII के रूप में प्रदर्शित नहीं किया जा सकता है, इससे त्रुटियों का कारण बन जाएगा।

1

"..."। एनकोड ("utf-8") स्ट्रिंग के इन-मेमोरी प्रस्तुति को यूटीएफ -8-एनकोडेड स्ट्रिंग में बदल देता है।

यूआरएल एन्कोडर संभवतः एक बाइटिंगिंग की उम्मीद है, यानी स्ट्रिंग प्रतिनिधित्व है जहां प्रत्येक चरित्र को एक बाइट के साथ दर्शाया जाता है।

0

यह यूनिकोड स्ट्रिंग, mystr का एक यूटीएफ -8 एन्कोडेड संस्करण देता है। यह जानना महत्वपूर्ण है कि यूटीएफ -8 यूनिकोड एन्कोडिंग का केवल 1 तरीका है। पायथन कई अन्य एन्कोडिंग के साथ काम कर सकता है (उदाहरण के लिए mystr.encode ("utf32") या यहां तक ​​कि mystr.encode ("ascii"))।

0

link कि बाल्फा ने इसे सब कुछ समझाया। संक्षेप में:

तथ्य यह है कि आपकी स्ट्रिंग "यू" के साथ उपसर्ग की गई थी, इसका मतलब है कि यह यूनिकोड वर्ण (या कोड बिंदु) से बना है। यूटीएफ -8 इस स्ट्रिंग का एन्कोडिंग बाइट के अनुक्रम में है।

13

मेरी मूल स्ट्रिंग एक यूनिकोड स्ट्रिंग वैसे भी (अर्थात एक यू के उपसर्ग)

... जो समस्या है था। यह एक "स्ट्रिंग" नहीं था, लेकिन एक "यूनिकोड ऑब्जेक्ट"। इसमें यूनिकोड कोड बिंदुओं का अनुक्रम शामिल है। इन कोड बिंदुओं में, निश्चित रूप से, कुछ आंतरिक प्रतिनिधित्व होना चाहिए जो पाइथन को पता है, लेकिन जो कुछ भी है उसे दूर किया गया है और print repr(my_u_str) पर उन्हें \uXXXX इकाइयों के रूप में दिखाया गया है।

बाइट्स का अनुक्रम प्राप्त करने के लिए एक और प्रोग्राम समझ सकता है, आपको यूनिकोड कोड बिंदुओं का अनुक्रम लेने और इसे एन्कोड करने की आवश्यकता है। आपको एन्कोडिंग पर निर्णय लेने की ज़रूरत है, क्योंकि इसमें से चुनने के लिए बहुत सारे विकल्प हैं। यूटीएफ 8 और यूटीएफ 16 आम विकल्प हैं। एएससीआईआई भी फिट हो सकता है, अगर यह फिट बैठता है। u"abc".encode('ascii') बस ठीक काम करता है।

करो my_u_str = u"\u2119ython" और फिर type(my_u_str) और type(my_u_str.encode('utf8')) प्रकार में अंतर को देखने के लिए: पहले <type 'unicode'> और दूसरा <type 'str'> है। (पायथन 2.5 और 2.6 के तहत, वैसे भी)।

चीजें पाइथन 3 में अलग हैं, लेकिन चूंकि मैं शायद ही कभी इसका उपयोग करता हूं, इसलिए मैं अपनी टोपी से बात कर रहा हूं अगर मैंने इसके बारे में कुछ भी आधिकारिक कहने की कोशिश की।

+0

+1 ग्रेट स्पष्टीकरण। –

+0

[यह] (https://tools.ietf.org/html/rfc3986) कुछ भी पहले से ASCII के लिए utf-8 को इंगित करता है, और यदि यह w3schools से है तो हम जानते हैं कि इसका कोई अधिकार नहीं है। w3fools.com – stommepoes

4

.encode ("utf8") क्या करता है?

यह निर्भर करता है अजगर का कौन सा संस्करण पर आप उपयोग कर रहे:

  • अजगर 3.x में, यह एक bytes वस्तु में एक str वस्तु (UTF-16 या UTF-32 में encoded) धर्मान्तरित जिसमें स्ट्रिंग का यूटीएफ -8 प्रतिनिधित्व शामिल है।
  • पायथन 2.x में, यह unicode ऑब्जेक्ट को यूटीएफ -8 में एन्कोड किए गए str ऑब्जेक्ट में परिवर्तित करता है। लेकिन str में encode विधि भी है, और '...'.encode('UTF-8') लिखना '...'.decode('ascii').encode('UTF-8') लिखने के बराबर है।

चूंकि आपने "यू" उपसर्ग का उल्लेख किया है, तो आपको 2.x का उपयोग करना होगा। यदि आपको किसी भी 2.x- केवल पुस्तकालयों की आवश्यकता नहीं है, तो मैं 3.x पर स्विच करने की अनुशंसा करता हूं, जिसमें पाठ और बाइनरी डेटा के बीच एक अच्छा स्पष्ट अंतर है।

Dive into Python 3 इस मुद्दे का एक अच्छा स्पष्टीकरण है।

क्या कोई समझा सकता है कि क्या हुआ?

अगर आपको बताया गया कि त्रुटि संदेश क्या था तो इससे मदद मिलेगी।

urllib.quote फ़ंक्शन str ऑब्जेक्ट की अपेक्षा करता है। यह unicode ऑब्जेक्ट्स के साथ काम करने के लिए भी होता है जिसमें केवल ASCII वर्ण होते हैं, लेकिन जब वे हिब्रू अक्षरों में नहीं होते हैं।

अजगर 3.x में, urllib.parse.quote दोनों str (= पायथन 2.x unicode) और bytes वस्तुओं स्वीकार करता है। स्ट्रिंग्स स्वचालित रूप से यूटीएफ -8 में एन्कोड किए जाते हैं।

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