আপনার প্রশ্নটি ভুল; আপনি যে ত্রুটিটি দেখছেন তা অজগরটি কীভাবে তৈরি করেছিলেন তার ফলাফল নয়, বাইট স্ট্রিং এবং ইউনিকোড স্ট্রিংগুলির মধ্যে বিভ্রান্তির।
বাইট স্ট্রিং (যেমন "ফু", বা 'বার', পাইথন সিনট্যাক্সে) অক্টেটের ক্রম; 0-255 থেকে সংখ্যা। ইউনিকোড স্ট্রিং (যেমন u "foo" বা u'bar ') ইউনিকোড কোড পয়েন্টের ক্রম; 0-1112064 থেকে সংখ্যা। তবে আপনি the চরিত্রটিতে আগ্রহী বলে মনে হচ্ছে, যা (আপনার টার্মিনালে) একটি একক অক্ষরকে উপস্থাপন করে এমন একাধিক বাইট অনুক্রম।
পরিবর্তে 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
।
ইউনিকোড গ্লোসারি এই কয়েকটি বিষয় বোঝার জন্য সহায়ক গাইড হতে পারে, প্রতিটি নির্দিষ্ট শব্দটি কীভাবে পাঠ্যের উপস্থাপনের একটি পৃথক অংশকে বোঝায়, যা অনেক প্রোগ্রামার বুঝতে পারে তার চেয়ে অনেক জটিল।