ইউনিকোড স্ট্রিংয়ের সাথে কাজ করার সমস্যার মূল উত্স হ'ল আপনি যখন ইউনিকোডের সাথে utf-8 এনকোডযুক্ত স্ট্রিংগুলি মিশ্রিত করেন।
উদাহরণস্বরূপ, নিম্নলিখিত স্ক্রিপ্টগুলি বিবেচনা করুন।
two.py
# encoding: utf-8
name = 'helló wörld from two'
one.py
# encoding: utf-8
from __future__ import unicode_literals
import two
name = 'helló wörld from one'
print name + two.name
চলমান আউটপুট python one.py
হয়:
Traceback (most recent call last):
File "one.py", line 5, in <module>
print name + two.name
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
এই উদাহরণে, two.name
একটি utf-8 এনকোড স্ট্রিং (ইউনিকোড নয়) যেহেতু এটি আমদানি করে নি unicode_literals
, এবং one.name
এটি একটি ইউনিকোড স্ট্রিং। আপনি উভয় মিশ্রন করলে পাইথন এনকোডযুক্ত স্ট্রিংটি ডিকোড করার চেষ্টা করে (এটি আসকি বলে ধরে নিচ্ছে) এবং এটি ইউনিকোডে রূপান্তরিত করে এবং ব্যর্থ হয়। আপনি যদি এটি কাজ করবে print name + two.name.decode('utf-8')
।
আপনি যদি কোনও স্ট্রিং এনকোড করে পরে মিশ্রিত করার চেষ্টা করেন তবে একই জিনিস ঘটতে পারে। উদাহরণস্বরূপ, এটি কাজ করে:
# encoding: utf-8
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
আউটপুট:
DEBUG: <html><body>helló wörld</body></html>
তবে যুক্ত করার পরে import unicode_literals
এটি হয় না:
# encoding: utf-8
from __future__ import unicode_literals
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
আউটপুট:
Traceback (most recent call last):
File "test.py", line 6, in <module>
print 'DEBUG: %s' % html
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)
এটি ব্যর্থ হয়েছে কারণ 'DEBUG: %s'
একটি ইউনিকোড স্ট্রিং এবং তাই অজগরটি ডিকোড করার চেষ্টা করে html
। মুদ্রণ ঠিক করার বেশ কয়েকটি উপায় হয় হয় print str('DEBUG: %s') % html
বা হয় print 'DEBUG: %s' % html.decode('utf-8')
।
আমি আশা করি ইউনিকোড স্ট্রিং ব্যবহার করার সময় এটি আপনাকে সম্ভাব্য গোটাচগুলি বুঝতে সহায়তা করে।
decode()
সমাধানগুলিরstr()
বা সমাধানগুলির পরিবর্তে সমাধানগুলির সাথে যেতে পরামর্শ দেবencode()
: আপনি যত বেশি ঘন ঘন ইউনিকোড অবজেক্ট ব্যবহার করেন, কোডটি পরিষ্কার হয়, আপনি যা চান তা হ'ল বাহ্যিকভাবে আবদ্ধ এনকোডিং সহ বাইটের অ্যারেগুলি নয় not