কোনও স্ট্রিং ইউনিকোড বা এসসিআই কিনা তা আমি কীভাবে পরীক্ষা করব?


271

স্ট্রিংটিতে কোন এনকোডিং রয়েছে তা বের করার জন্য পাইথনে আমাকে কী করতে হবে?


56
ইউনিকোড হয় না এনকোডিং।
ulidtko

আরও গুরুত্বপূর্ণ, আপনার যত্ন করা উচিত কেন?
জনসয়েব

@Johnsyweb কারণে{UnicodeDecodeError} 'ascii' codec can't decode byte 0xc2
Alex

উত্তর:


295

পাইথন 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"

এটি "ইউনিকোড বা এএসসিআইআই" পার্থক্য করে না; এটি কেবল পাইথন প্রকারের পার্থক্য করে। একটি ইউনিকোড স্ট্রিং এএসসিআইআই ব্যাপ্তিতে বিশুদ্ধরূপে অক্ষর ধারণ করতে পারে এবং একটি বাইটারেস্টিং এএসসিআইআই, এনকোডযুক্ত ইউনিকোড, এমনকি অ-পাঠ্যহীন ডেটাও থাকতে পারে।


3
@ProsperousHeart: আপনি সম্ভবত পাইথন 3. ব্যবহার করছেন
গ্রেগ Hewgill

124

কোনও অবজেক্টটি ইউনিকোড স্ট্রিং বা বাইট স্ট্রিং কিনা তা কীভাবে বলা যায়

আপনি ব্যবহার করতে পারেন 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হয়।


বাইট স্ট্রিংটি বৈধ utf-8 বা ascii হয় কীভাবে তা বলবেন

আপনি কল করতে পারেন 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)

কেবলমাত্র অন্য লোকের রেফারেন্সের জন্য - str.decode অজগরটিতে বিদ্যমান নেই 3. মনে হচ্ছে আপনার unicode(s, "ascii")কিছু আছে বা আছে
শ্যাডো

3
দুঃখিত, আমি বোঝাতে চেয়েছিstr(s, "ascii")
ছায়া

1
এই পাইথন 3 সঠিক নয়
ProsperousHeart

2
পাইথন ৩-কে কভার করার জন্য @ প্রসপারস হার্ট আপডেট হয়েছে And এবং বাইটস্ট্রিং এবং ইউনিকোড স্ট্রিংয়ের মধ্যে পার্থক্য ব্যাখ্যা করার চেষ্টা করার জন্য।
মাইকেল

44

অজগর 3.x এ সমস্ত স্ট্রিং ইউনিকোড অক্ষরের ক্রম। এবং স্ট্রিংয়ের জন্য আইসনস্ট্যান্স চেক করা (যার অর্থ ডিফল্টরূপে ইউনিকোড স্ট্রিং রয়েছে) যথেষ্ট।

isinstance(x, str)

পাইথন ২.x এর সাথে, বেশিরভাগ লোকেরা একটি আইএফ স্টেটমেন্ট ব্যবহার করছেন বলে মনে হয় যাতে দুটি চেক রয়েছে। স্ট্রের জন্য একটি এবং ইউনিকোডের জন্য একটি।

আপনি যদি একটি বিবৃতি সহ সমস্ত কিছু 'স্ট্রিং-জাতীয়' অবজেক্টের সাথে দেখতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:

isinstance(x, basestring)

এটা মিথ্যা। পাইথনে ২.7 isinstance(u"x",basestring)রিটার্নে True
পাইথননট

11
@ পাইথননট: আমি বিশ্বাস করি এটিই মূল বিষয় ছিল। উপরের স্বতন্ত্র দ্বৈত পরীক্ষাগুলি প্রতিস্থাপনের জন্য আইসিনস্ট্যান্স (এক্স, বেসস্ট্রিং) এর ব্যবহার যথেষ্ট।
কিউ।

5
এটি অনেক ক্ষেত্রে কার্যকর, তবে সম্ভবত প্রশ্নকর্তা কী বোঝাতে চেয়েছিলেন তা নয়।
মোহাম্মিথ

3
এইটি হলো প্রশ্নটির উত্তর। অন্যরা ওপি কী বলেছে তা ভুল বুঝেছিল এবং পাইথনে টাইপ চেকিং সম্পর্কে জেনেরিক উত্তর দেয়।
ফায়াতজাফ

1
ওপির প্রশ্নের উত্তর দেয় না। প্রশ্নের শিরোনাম (একা) এ জাতীয় ব্যাখ্যা দেওয়া উচিত যে এই উত্তরটি সঠিক। যাইহোক, ওপি বিশেষত প্রশ্নের বর্ণনায় "কোনটি চিহ্নিত করুন" বলেছেন এবং এই উত্তরটি এটিকে সম্বোধন করে না।
MD004

31

ইউনিকোড কোনও এনকোডিং নয় - কুমার ম্যাকমিলানকে উদ্ধৃত করার জন্য:

যদি ASCII, UTF-8, এবং অন্যান্য বাইট স্ট্রিংগুলি "পাঠ্য" হয় ...

... তাহলে ইউনিকোড হ'ল "পাঠ্য-নেস";

এটি পাঠ্যের বিমূর্ত রূপ

পাইথনে ম্যাকমিলানের ইউনিকোড পড়ুন, পাইকন ২০০৮-এর সম্পূর্ণ ডেমিসিফাইড টক, এটি স্ট্যাক ওভারফ্লো সম্পর্কিত সম্পর্কিত উত্তরগুলির চেয়ে অনেক ভাল বিষয় ব্যাখ্যা করে।


এই স্লাইডগুলি সম্ভবত ইউনিকোডের সেরা পরিচয় যা আমি আজ
অবধি

23

যদি আপনার কোডটি পাইথন 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)

এগুলি উভয়ই অযৌক্তিক এবং বেশিরভাগ সময় সম্ভবত আরও ভাল উপায় আছে।


6
সম্ভবত আরও ভাল sixsix.binary_typesix.text_type
উপায়টি

1
প্রকারের নাম অনুসন্ধানের জন্য আপনি প্রকার (গুলি) __ নাম__ ব্যবহার করতে পারেন ।
পাওলো ফ্রেইটাস

কোনও বিযুক্তিক ত্রুটি না হলে আমি সেই বিট কোডের জন্য ব্যবহারের ক্ষেত্রে যথেষ্ট নিশ্চিত নই। আমি মনে করি পাইথন 2 কোডে একটি "না" থাকা উচিত। অন্যথায় আপনি পাইথন 3 এবং পাইথন 2 এর বিপরীতে সবকিছুকে ইউনিকোড স্ট্রিংয়ে রূপান্তর করছেন!
অলিগোফ্রেন

হ্যাঁ, অলিগোফ্রেন, এটিই তাই করে। স্ট্যান্ডার্ড অভ্যন্তরীণ স্ট্রিংগুলি পাইথন 3-এ ইউনিকোড এবং পাইথন 2 এ ASCII হয় So
ডেভ বার্টন

12

ব্যবহার করুন:

import six
if isinstance(obj, six.text_type)

ছয়টি গ্রন্থাগারের ভিতরে এটি উপস্থাপন করা হয়:

if PY3:
    string_types = str,
else:
    string_types = basestring,

2
এটা হওয়া উচিত if isinstance(obj, six.text_type) । তবে হ্যাঁ, এটি সঠিক উত্তর o
করানটান

ওপির প্রশ্নের উত্তর দেয় না। প্রশ্নের শিরোনাম (একা) এ জাতীয় ব্যাখ্যা দেওয়া উচিত যে এই উত্তরটি সঠিক। যাইহোক, ওপি বিশেষত প্রশ্নের বর্ণনায় "কোনটি চিহ্নিত করুন" বলেছেন এবং এই উত্তরটি এটিকে সম্বোধন করে না।
MD004

4

দ্রষ্টব্য যে পাইথন 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

তাদের আলাদা করার জন্য একই পদ্ধতি ব্যবহার করা হয়।


3

এটি অন্য কাউকে সহায়তা করতে পারে, আমি ভেরিয়েবলের স্ট্রিং ধরণের জন্য পরীক্ষা শুরু করেছিলাম, তবে আমার অ্যাপ্লিকেশনটির জন্য, কেবলমাত্র ইউটিএফ -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

আপনি আমার বন্ধুটি সঠিক প্রতিক্রিয়া হওয়ার যোগ্য! আমি অজগর 3 ব্যবহার করছি এবং আমি এই ধন খুঁজে না পাওয়া পর্যন্ত আমার এখনও সমস্যা ছিল!
mnsr

2

আপনি ইউনিভার্সাল এনকোডিং ডিটেক্টর ব্যবহার করতে পারেন , তবে সচেতন থাকুন যে এটি আপনাকে সর্বোত্তম অনুমান দেবে, প্রকৃত এনকোডিং নয়, কারণ উদাহরণস্বরূপ একটি স্ট্রিং "এবিসি" এর এনকোডিং জানা অসম্ভব। আপনাকে অন্য কোথাও এনকোডিংয়ের তথ্য পেতে হবে, যেমন HTTP প্রোটোকল এর জন্য সামগ্রী-প্রকারের শিরোনাম ব্যবহার করে।



0

একটি সহজ পদ্ধতির মধ্যে unicodeঅন্তর্নির্মিত ফাংশন কিনা তা পরীক্ষা করা । যদি তা হয় তবে আপনি পাইথন 2 এ আছেন এবং আপনার স্ট্রিংটি একটি স্ট্রিং হবে। সবকিছু unicodeএকের মধ্যে রয়েছে তা নিশ্চিত করতে:

import builtins

i = 'cats'
if 'unicode' in dir(builtins):     # True in python 2, False in 3
  i = unicode(i)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.