উত্তর:
পাইথন 3-এ, সমস্ত স্ট্রিং ইউনিকোড অক্ষরের ক্রম। এমন এক bytes
ধরণের রয়েছে যা কাঁচা বাইট রাখে।
পাইথন 2 এ, একটি স্ট্রিং টাইপ str
বা ধরণের হতে পারে unicode
। কোনটি কোড ব্যবহার করে আপনি এরকম কিছু বলতে পারেন:
def whatisthis(s):
if isinstance(s, str):
print "ordinary string"
elif isinstance(s, unicode):
print "unicode string"
else:
print "not a string"
এটি "ইউনিকোড বা এএসসিআইআই" পার্থক্য করে না; এটি কেবল পাইথন প্রকারের পার্থক্য করে। একটি ইউনিকোড স্ট্রিং এএসসিআইআই ব্যাপ্তিতে বিশুদ্ধরূপে অক্ষর ধারণ করতে পারে এবং একটি বাইটারেস্টিং এএসসিআইআই, এনকোডযুক্ত ইউনিকোড, এমনকি অ-পাঠ্যহীন ডেটাও থাকতে পারে।
আপনি ব্যবহার করতে পারেন type
বা isinstance
।
পাইথন 2 এ:
>>> type(u'abc') # Python 2 unicode string literal
<type 'unicode'>
>>> type('abc') # Python 2 byte string literal
<type 'str'>
পাইথন 2-এ, str
বাইটের কেবল একটি ক্রম। পাইথন জানে না এর এনকোডিং কী। unicode
টাইপ দোকান পাঠে নিরাপদ উপায়। আপনি যদি এটি আরও বুঝতে চান তবে আমি http://farmdev.com/talks/unicode/ কে প্রস্তাব দিই ।
পাইথন 3 এ:
>>> type('abc') # Python 3 unicode string literal
<class 'str'>
>>> type(b'abc') # Python 3 byte string literal
<class 'bytes'>
পাইথন 3-তে str
পাইথন 2 এর মতো unicode
এবং এটি পাঠ্য সঞ্চয় করতে ব্যবহৃত হয়। str
পাইথন 2 তে যা বলা হত পাইথন 3 তে ডাকা bytes
হয়।
আপনি কল করতে পারেন decode
। যদি এটি কোনও ইউনিকোড ডিকোডেরর ব্যতিক্রম উত্থাপন করে তবে তা বৈধ ছিল না।
>>> u_umlaut = b'\xc3\x9c' # UTF-8 representation of the letter 'Ü'
>>> u_umlaut.decode('utf-8')
u'\xdc'
>>> u_umlaut.decode('ascii')
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)
unicode(s, "ascii")
কিছু আছে বা আছে
str(s, "ascii")
অজগর 3.x এ সমস্ত স্ট্রিং ইউনিকোড অক্ষরের ক্রম। এবং স্ট্রিংয়ের জন্য আইসনস্ট্যান্স চেক করা (যার অর্থ ডিফল্টরূপে ইউনিকোড স্ট্রিং রয়েছে) যথেষ্ট।
isinstance(x, str)
পাইথন ২.x এর সাথে, বেশিরভাগ লোকেরা একটি আইএফ স্টেটমেন্ট ব্যবহার করছেন বলে মনে হয় যাতে দুটি চেক রয়েছে। স্ট্রের জন্য একটি এবং ইউনিকোডের জন্য একটি।
আপনি যদি একটি বিবৃতি সহ সমস্ত কিছু 'স্ট্রিং-জাতীয়' অবজেক্টের সাথে দেখতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:
isinstance(x, basestring)
isinstance(u"x",basestring)
রিটার্নে True
।
ইউনিকোড কোনও এনকোডিং নয় - কুমার ম্যাকমিলানকে উদ্ধৃত করার জন্য:
যদি ASCII, UTF-8, এবং অন্যান্য বাইট স্ট্রিংগুলি "পাঠ্য" হয় ...
... তাহলে ইউনিকোড হ'ল "পাঠ্য-নেস";
এটি পাঠ্যের বিমূর্ত রূপ
পাইথনে ম্যাকমিলানের ইউনিকোড পড়ুন, পাইকন ২০০৮-এর সম্পূর্ণ ডেমিসিফাইড টক, এটি স্ট্যাক ওভারফ্লো সম্পর্কিত সম্পর্কিত উত্তরগুলির চেয়ে অনেক ভাল বিষয় ব্যাখ্যা করে।
যদি আপনার কোডটি পাইথন 2 এবং পাইথন 3 উভয়ের সাথে সামঞ্জস্য করার প্রয়োজন হয় তবে আপনি সরাসরি চেষ্টা বা বাদ দিয়ে বা পাইথন সংস্করণ পরীক্ষায় এগুলি মোড়ানো isinstance(s,bytes)
বা ব্যবহার isinstance(s,unicode)
ছাড়া সরাসরি ব্যবহার করতে পারবেন না , কারণ bytes
পাইথন 2 unicode
এ অপরিজ্ঞাত এবং পাইথন 3 এ অপরিজ্ঞাত রয়েছে ।
কিছু কুৎসিত workaround আছে। একটি অত্যন্ত কুশ্রী এক তুলনা করে নাম পরিবর্তে টাইপ নিজেই তুলনা, টাইপ করুন। এখানে একটি উদাহরণ:
# convert bytes (python 3) or unicode (python 2) to str
if str(type(s)) == "<class 'bytes'>":
# only possible in Python 3
s = s.decode('ascii') # or s = str(s)[2:-1]
elif str(type(s)) == "<type 'unicode'>":
# only possible in Python 2
s = str(s)
একটি যুক্তিযুক্তভাবে কিছুটা কম কুৎসিত কাজটি পাইথন সংস্করণ নম্বরটি পরীক্ষা করা, যেমন:
if sys.version_info >= (3,0,0):
# for Python 3
if isinstance(s, bytes):
s = s.decode('ascii') # or s = str(s)[2:-1]
else:
# for Python 2
if isinstance(s, unicode):
s = str(s)
এগুলি উভয়ই অযৌক্তিক এবং বেশিরভাগ সময় সম্ভবত আরও ভাল উপায় আছে।
six
six.binary_type
six.text_type
ব্যবহার করুন:
import six
if isinstance(obj, six.text_type)
ছয়টি গ্রন্থাগারের ভিতরে এটি উপস্থাপন করা হয়:
if PY3:
string_types = str,
else:
string_types = basestring,
if isinstance(obj, six.text_type)
। তবে হ্যাঁ, এটি সঠিক উত্তর o
দ্রষ্টব্য যে পাইথন 3-তে, এর মধ্যে কোনওটি বলা সত্যিই ন্যায্য নয়:
str
গুলি যে কোনও এক্সের জন্য ইউটিএফএক্স (যেমন ইউটিএফ 8)
str
গুলি ইউনিকোড
str
গুলি ইউনিকোড অক্ষর সংগ্রহ করার আদেশ দেওয়া হয়
পাইথনের ধরণটি str
(সাধারণত) ইউনিকোড কোড পয়েন্টের ক্রম হয়, যার মধ্যে কয়েকটি মানচিত্রকে অক্ষরে রূপ দেয়।
পাইথন 3 তেও, আপনি যতটা ভাবতে পারেন এই প্রশ্নের উত্তর দেওয়া এত সহজ নয়।
ASCII- সামঞ্জস্যপূর্ণ স্ট্রিংগুলির জন্য পরীক্ষার একটি সুস্পষ্ট উপায় হ'ল একটি চেষ্টা করা এনকোড দ্বারা:
"Hello there!".encode("ascii")
#>>> b'Hello there!'
"Hello there... ☃!".encode("ascii")
#>>> Traceback (most recent call last):
#>>> File "", line 4, in <module>
#>>> UnicodeEncodeError: 'ascii' codec can't encode character '\u2603' in position 15: ordinal not in range(128)
ত্রুটি কেসগুলি পৃথক করে।
পাইথন 3-তে, এমন কিছু স্ট্রিং রয়েছে যা অবৈধ ইউনিকোড কোড পয়েন্ট ধারণ করে:
"Hello there!".encode("utf8")
#>>> b'Hello there!'
"\udcc3".encode("utf8")
#>>> Traceback (most recent call last):
#>>> File "", line 19, in <module>
#>>> UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 0: surrogates not allowed
তাদের আলাদা করার জন্য একই পদ্ধতি ব্যবহার করা হয়।
এটি অন্য কাউকে সহায়তা করতে পারে, আমি ভেরিয়েবলের স্ট্রিং ধরণের জন্য পরীক্ষা শুরু করেছিলাম, তবে আমার অ্যাপ্লিকেশনটির জন্য, কেবলমাত্র ইউটিএফ -8 হিসাবে ফিরে আসার জন্য এটি আরও বোধগম্য হয়েছিল। প্রক্রিয়াটি রিটার্ন_টফকে কল করে, তারপরে এটি কী আচরণ করছে তা জানে এবং স্ট্রিংটি যথাযথভাবে পরিচালনা করতে পারে। কোডটি আধ্যাত্মিক নয়, তবে আমি এটি সংস্করণ পরীক্ষা বা ছয়টি আমদানি না করে পাইথন সংস্করণ অজ্ঞেয়িক হতে চাই। অন্যান্য ব্যক্তিদের সহায়তা করতে দয়া করে নীচের নমুনা কোডের উন্নতির সাথে মন্তব্য করুন।
def return_utf(s):
if isinstance(s, str):
return s.encode('utf-8')
if isinstance(s, (int, float, complex)):
return str(s).encode('utf-8')
try:
return s.encode('utf-8')
except TypeError:
try:
return str(s).encode('utf-8')
except AttributeError:
return s
except AttributeError:
return s
return s # assume it was already utf-8
আপনি ইউনিভার্সাল এনকোডিং ডিটেক্টর ব্যবহার করতে পারেন , তবে সচেতন থাকুন যে এটি আপনাকে সর্বোত্তম অনুমান দেবে, প্রকৃত এনকোডিং নয়, কারণ উদাহরণস্বরূপ একটি স্ট্রিং "এবিসি" এর এনকোডিং জানা অসম্ভব। আপনাকে অন্য কোথাও এনকোডিংয়ের তথ্য পেতে হবে, যেমন HTTP প্রোটোকল এর জন্য সামগ্রী-প্রকারের শিরোনাম ব্যবহার করে।
পাই 2 / পাই 3 এর সামঞ্জস্যের জন্য কেবল ব্যবহার করুন
import six
if isinstance(obj, six.text_type)
একটি সহজ পদ্ধতির মধ্যে unicode
অন্তর্নির্মিত ফাংশন কিনা তা পরীক্ষা করা । যদি তা হয় তবে আপনি পাইথন 2 এ আছেন এবং আপনার স্ট্রিংটি একটি স্ট্রিং হবে। সবকিছু unicode
একের মধ্যে রয়েছে তা নিশ্চিত করতে:
import builtins
i = 'cats'
if 'unicode' in dir(builtins): # True in python 2, False in 3
i = unicode(i)