आपका प्रश्न गलत है; आप जो त्रुटि देखते हैं, वह यह नहीं है कि आपने अजगर को कैसे बनाया, बल्कि बाइट स्ट्रिंग्स और यूनिक स्ट्रिंग्स के बीच एक भ्रम है।
बाइट स्ट्रिंग्स (जैसे "फू", या 'बार', पायथन सिंटैक्स में) ऑक्टेट के अनुक्रम हैं; 0-255 से नंबर। यूनिकोड स्ट्रिंग्स (जैसे u "foo" या u'bar ') यूनिकोड कोड पॉइंट्स के सीक्वेंस हैं; 0-1112064 से नंबर। लेकिन आप चरित्र é में रुचि रखते हैं, जो (आपके टर्मिनल में) एक बहु-बाइट अनुक्रम है जो एकल चरित्र का प्रतिनिधित्व करता है।
इसके बजाय ord(u'é')
, यह प्रयास करें:
>>> [ord(x) for x in u'é']
यह बताता है कि "é" कोड बिंदुओं का कौन सा अनुक्रम दर्शाता है। यह आपको [233] दे सकता है, या यह आपको [101, 770] दे सकता है।
chr()
इसे उलटने के बजाय , यह है unichr()
:
>>> unichr(233)
u'\xe9'
यह चरित्र वास्तव में एक एकल या एकाधिक यूनिकोड "कोड पॉइंट" का प्रतिनिधित्व कर सकता है, जो स्वयं या तो अंगूर या वर्णों का प्रतिनिधित्व करता है। यह या तो "एक तीव्र उच्चारण के साथ ई (यानी, कोड बिंदु 233)", या "ई" (कोड बिंदु 101) है, इसके बाद "पिछले चरित्र पर एक तीव्र उच्चारण" (कोड बिंदु 770)। तो यह ठीक उसी चरित्र को पायथन डेटा संरचना के रूप में प्रस्तुत किया जा सकता है u'e\u0301'
याu'\u00e9'
।
अधिकांश समय आपको इस बारे में परवाह नहीं करनी चाहिए, लेकिन यह एक मुद्दा बन सकता है यदि आप एक यूनिकोड स्ट्रिंग से अधिक पुनरावृत्ति कर रहे हैं, क्योंकि यह पुनरावृत्ति कोड बिंदु द्वारा काम करता है, न कि डीकोप्रोजेबल कैरेक्टर द्वारा। दूसरे शब्दों में, len(u'e\u0301') == 2
और len(u'\u00e9') == 1
। यदि यह आपके लिए मायने रखता है, तो आप उपयोग करके संक्षिप्त और विघटित रूपों के बीच परिवर्तित कर सकते हैंunicodedata.normalize
।
यूनिकोड शब्दावली इन मुद्दों में से कुछ को समझने के लिए एक उपयोगी मार्गदर्शिका हो सकती है, यह इंगित करके कि कैसे प्रत्येक विशिष्ट शब्द पाठ के प्रतिनिधित्व के एक अलग हिस्से को संदर्भित करता है, जो कई प्रोग्रामर द्वारा महसूस किए जाने की तुलना में कहीं अधिक जटिल है।