পাইথন: আইএসও -8859-1 / লাতিন 1 থেকে ইউটিএফ -8 এ রূপান্তর করা


89

আমার কাছে এই স্ট্রিংটি ইমেল মডিউলটির সাথে উদ্ধৃত-প্রিন্টেবল থেকে আইএসও -8859-1 এ ডিকোড হয়েছে। এটি আমাকে "C xC4pple" এর মতো স্ট্রিং দেয় যা "lepple" (সুইডিশ ভাষায় অ্যাপল) এর সাথে মিল রাখে। তবে, আমি এই স্ট্রিংগুলিকে ইউটিএফ -8 এ রূপান্তর করতে পারি না।

>>> apple = "\xC4pple"
>>> apple
'\xc4pple'
>>> apple.encode("UTF-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in     range(128)

আমার কি করা উচিৎ?

উত্তর:


123

প্রথমে এটিকে ডিকোড করার চেষ্টা করুন, তারপরে এনকোডিং:

apple.decode('iso-8859-1').encode('utf8')

4
আমার ভাষা (পর্তুগিজ) ভাষাতে স্টকগুলি এনকোড করতে আমার কিছু সমস্যা হয়েছিল, তাই আমার জন্য যা কাজ করেছিল তা ছিল স্ট্রিং ডিকোড ('আইসো -8859-1') enc এনকোড ('লাতিন 1')। এছাড়াও, আমার অজগর ফাইলের শীর্ষে, আমার কাছে এই # - - কোডিং: ল্যাটিন -1 - -
মুন

151

এটি একটি সাধারণ সমস্যা, সুতরাং এখানে তুলনামূলকভাবে পূর্ণ চিত্রণ।

অ-ইউনিকোড স্ট্রিং (অর্থাত ছাড়া তাদের জন্য uমত উপসর্গ u'\xc4pple'), নেটিভ এনকোডিং (থেকে এক আবশ্যক ডিকোড iso8859-1/ latin1, যদি না হেঁয়ালিপূর্ণ সঙ্গে পরিবর্তিতsys.setdefaultencoding ফাংশন) থেকে unicode, তারপর এই ক্ষেত্রে যে অক্ষরগুলি আপনি চান প্রদর্শন করতে পারেন একটি অক্ষর সেটে সঙ্কেতাক্ষরে লিখা, আমি 'সুপারিশ UTF-8

প্রথমত, এখানে একটি কার্যকর ইউটিলিটি ফাংশন যা পাইথন ২.7 স্ট্রিং এবং ইউনিকোডের নিদর্শনগুলি আলোকিত করতে সহায়তা করবে:

>>> def tell_me_about(s): return (type(s), s)

একটি সরল স্ট্রিং

>>> v = "\xC4pple" # iso-8859-1 aka latin1 encoded string

>>> tell_me_about(v)
(<type 'str'>, '\xc4pple')

>>> v
'\xc4pple'        # representation in memory

>>> print v
?pple             # map the iso-8859-1 in-memory to iso-8859-1 chars
                  # note that '\xc4' has no representation in iso-8859-1, 
                  # so is printed as "?".

একটি iso8859-1 স্ট্রিং ডিকোডিং - প্লেইন স্ট্রিংটিকে ইউনিকোডে রূপান্তর করুন

>>> uv = v.decode("iso-8859-1")
>>> uv
u'\xc4pple'       # decoding iso-8859-1 becomes unicode, in memory

>>> tell_me_about(uv)
(<type 'unicode'>, u'\xc4pple')

>>> print v.decode("iso-8859-1")
Äpple             # convert unicode to the default character set
                  # (utf-8, based on sys.stdout.encoding)

>>> v.decode('iso-8859-1') == u'\xc4pple'
True              # one could have just used a unicode representation 
                  # from the start

আরও একটি উদাহরণ - "Ä" সহ

>>> u"Ä" == u"\xc4"
True              # the native unicode char and escaped versions are the same

>>> "Ä" == u"\xc4"  
False             # the native unicode char is '\xc3\x84' in latin1

>>> "Ä".decode('utf8') == u"\xc4"
True              # one can decode the string to get unicode

>>> "Ä" == "\xc4"
False             # the native character and the escaped string are
                  # of course not equal ('\xc3\x84' != '\xc4').

ইউটিএফ-তে এনকোডিং

>>> u8 = v.decode("iso-8859-1").encode("utf-8")
>>> u8
'\xc3\x84pple'    # convert iso-8859-1 to unicode to utf-8

>>> tell_me_about(u8)
(<type 'str'>, '\xc3\x84pple')

>>> u16 = v.decode('iso-8859-1').encode('utf-16')
>>> tell_me_about(u16)
(<type 'str'>, '\xff\xfe\xc4\x00p\x00p\x00l\x00e\x00')

>>> tell_me_about(u8.decode('utf8'))
(<type 'unicode'>, u'\xc4pple')

>>> tell_me_about(u16.decode('utf16'))
(<type 'unicode'>, u'\xc4pple')

ইউনিকোড এবং ইউটিএফ এবং লাতিন 1 এর মধ্যে সম্পর্ক

>>> print u8
Äpple             # printing utf-8 - because of the encoding we now know
                  # how to print the characters

>>> print u8.decode('utf-8') # printing unicode
Äpple

>>> print u16     # printing 'bytes' of u16
���pple

>>> print u16.decode('utf16')
Äpple             # printing unicode

>>> v == u8
False             # v is a iso8859-1 string; u8 is a utf-8 string

>>> v.decode('iso8859-1') == u8
False             # v.decode(...) returns unicode

>>> u8.decode('utf-8') == v.decode('latin1') == u16.decode('utf-16')
True              # all decode to the same unicode memory representation
                  # (latin1 is iso-8859-1)

ইউনিকোড ব্যতিক্রম

 >>> u8.encode('iso8859-1')
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)

>>> u16.encode('iso8859-1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0:
  ordinal not in range(128)

>>> v.encode('iso8859-1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0:
  ordinal not in range(128)

এগুলির মধ্যে একটি নির্দিষ্ট এনকোডিং (ল্যাটিন -1, utf8, utf16) থেকে ইউনিকোডে রূপান্তরিত হয়ে উঠতে পারে u8.decode('utf8').encode('latin1')

সুতরাং সম্ভবত নিম্নলিখিত নীতিগুলি এবং সাধারণীকরণগুলি আঁকতে পারে:

  • টাইপটি strবাইটের একটি সেট, যার মধ্যে অনেকগুলি এনকোডিং থাকতে পারে যেমন লাতিন -১, ইউটিএফ -8, এবং ইউটিএফ -16
  • টাইপটি unicodeবাইটের একটি সেট যা যে কোনও সংখ্যক এনকোডিংয়ে রূপান্তরিত হতে পারে, সাধারণভাবে ইউটিএফ -8 এবং ল্যাটিন -1 (iso8859-1)
  • printকমান্ড রয়েছে এনকোডিং-এর জন্য নিজস্ব যুক্তিবিজ্ঞান , এর সেট sys.stdout.encodingএবং হল UTF-8 নির্ধারিত লিঙ্ক
  • strঅন্য একটি এনকোডিংয়ে রূপান্তর করার আগে একটিকে ইউনিকোডে ডিকোড করতে হবে ।

অবশ্যই, পাইথন 3.x এ এই সমস্ত পরিবর্তন হয়েছে।

আশা করি তা আলোকিত করছে।

আরও পড়া

আর আর্মিন রোনাচারের খুব বর্ণনামূলক রেন্টস:


13
এমন একটি বিশদ ব্যাখ্যা লিখতে সময় দেওয়ার জন্য ধন্যবাদ,
স্ট্যাকওভারফ্লোতে

6
কি দারুন. Succinct, খুব বোধগম্য এবং উদাহরণ দিয়ে ব্যাখ্যা করা হয়েছে। ইন্টারটিউবগুলি আরও ভাল করার জন্য ধন্যবাদ
বানর বসন

24

পাইথন 3 এর জন্য:

bytes(apple,'iso-8859-1').decode('utf-8')

আমি এটি ইউএসএফ -8859-1 হিসাবে ভুলভাবে এনকোড করা একটি পাঠ্যের জন্য ব্যবহার করেছি ( উফ x99ejnà like এর মতো শব্দগুলি দেখানো ) utf-8 এর পরিবর্তে। এই কোড সঠিক সংস্করণ উৎপন্ন Veřejné


কোথায় bytesথেকে এসেছে?
আলভাস

4
ডকুমেন্টেশন: বাইটস । এছাড়াও এই প্রশ্ন এবং এর উত্তর দেখুন।
মিশাল Skop

4
নিখোঁজ বা ভুল শিরোলেখগুলির সাথে অনুরোধের সাথে ডাউনলোড করা ফাইলগুলির জন্য: r = requests.get(url)এবং তারপরে সরাসরি সেটিংস r.encoding = 'utf-8'আমার জন্য কাজ করেছে
মাইকেল স্কপ

bytes.decode পদ্ধতি ডকুমেন্টেশন।
মাইকে

10

ইউনিকোডে ডিকোড করুন, ফলাফলগুলি ইউটিএফ 8 এ এনকোড করুন।

apple.decode('latin1').encode('utf8')

0
concept = concept.encode('ascii', 'ignore') 
concept = MySQLdb.escape_string(concept.decode('latin1').encode('utf8').rstrip())

আমি এটি করি, আমি নিশ্চিত নই যে এটি একটি ভাল পদ্ধতির কিনা তবে এটি প্রতিটি সময় কাজ করে !!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.