পাইথন ইউনিকোড এনকোড ত্রুটি


104

আমি একটি অ্যামাজন এক্সএমএল ফাইলটি পড়ছি এবং পার্স করছি এবং এক্সএমএল ফাইলটি 'দেখায়, যখন আমি এটি মুদ্রণের চেষ্টা করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই:

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128) 

অনলাইনে আমি যা পড়েছি তা থেকে ত্রুটিটি আসছিল যে এক্সএমএল ফাইলটি ইউটিএফ -8 এ রয়েছে, তবে পাইথন এএসসিআইআই এনকোডেড চরিত্র হিসাবে এটি পরিচালনা করতে চায়। ত্রুটিটি দূরে সরে যাওয়ার এবং আমার প্রোগ্রামটি XML পড়ার সাথে সাথে প্রিন্ট করার কোনও সহজ উপায় আছে?


আমি এই প্রশ্নটি পোস্ট করতে কেবল এস.ও. এর জন্য কোনও স্ট্রিং স্যানিটাইজ করার কোনও সহজ উপায় নেই unicode()?
নিক হেইনার

দয়া করে সম্পর্কিত প্রশ্নের এই উত্তরটিও পরীক্ষা করে দেখুন : "পাইথন ইউনিকোড ডিকোড এরির - আমি কী এনকোডকে ভুল বুঝছি?"
tzot

উত্তর:


193

সম্ভবত আপনার সমস্যাটি হ'ল আপনি এটিকে পার্স করেছেন ঠিক আছে, এবং এখন আপনি এক্সএমএল এর বিষয়বস্তু মুদ্রণের চেষ্টা করছেন এবং কিছু বিদেশী ইউনিকোড অক্ষর থাকার কারণে আপনি পারবেন না। আপনার ইউনিকোড স্ট্রিংটিকে প্রথম ascii হিসাবে এনকোড করার চেষ্টা করুন:

unicodeData.encode('ascii', 'ignore')

'উপেক্ষা' অংশটি এটিকে কেবল সেই চরিত্রগুলি এড়িয়ে যেতে বলবে। পাইথন ডক্স থেকে:

>>> u = unichr(40960) + u'abcd' + unichr(1972)
>>> u.encode('utf-8')
'\xea\x80\x80abcd\xde\xb4'
>>> u.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128)
>>> u.encode('ascii', 'ignore')
'abcd'
>>> u.encode('ascii', 'replace')
'?abcd?'
>>> u.encode('ascii', 'xmlcharrefreplace')
'&#40960;abcd&#1972;'

আপনি এই নিবন্ধটি পড়তে চাইতে পারেন: http://www.joelonsoftware.com/articles/Unicode.html , যা আমি যা চলছে তার একটি প্রাথমিক টিউটোরিয়াল হিসাবে খুব দরকারী বলে মনে করি। পড়ার পরে, আপনি এমন অনুভূতি থামিয়ে দেবেন যে আপনি কী অনুমান করছেন তা কেবল অনুমান করছেন (বা কমপক্ষে আমার ক্ষেত্রে এটি ঘটেছে)।


1
আমি নিম্নলিখিত স্ট্রিংগুলিকে নিরাপদ করার চেষ্টা করছি: 'ফু "বার বার" ডিএফ (কোঁকড়ানো উদ্ধৃতিগুলি নোট করুন), তবে উপরেরটি এখনও আমার জন্য ব্যর্থ হয়েছে।
নিক হেইনার

@ রোশারচ: কিভাবে ব্যর্থ? একই ত্রুটি? এবং কোন ত্রুটি-পরিচালনা নিয়ম আপনি ব্যবহার করেছেন?
স্কট স্টাফোর্ড

@ রোসার্চ, আপনার সমস্যা সম্ভবত আগেই ছিল। এই কোডটি ব্যবহার করে দেখুন: # - - কোডিং: ল্যাটিন -1 - - ইউ = ইউ 'ফু "বার বার" ডিএফ' মুদ্রণ ইউ.এনকোড ('এসকিআই', 'উপেক্ষা করুন') আপনার জন্য, সম্ভবত এটি আপনার স্ট্রিংকে ইউনিকোড প্রদত্ত রূপান্তরিত করছিল পাইথন স্ক্রিপ্টের জন্য আপনি যে এনকোডিংটি নির্দিষ্ট করেছেন তা ত্রুটি ছুঁড়েছে।
স্কট

আমি এগিয়ে গিয়ে নিজের ইস্যুটিকে নিজের প্রশ্নে পরিণত করেছি: stackoverflow.com/questions/3224427/…
নিক হেইনার

1
.encode('ascii', 'ignore')অপ্রয়োজনীয়ভাবে ডেটা হারায় এমনকি যদি ওপি-র পরিবেশে অ-
এস্কি

16

একটি ভাল সমাধান:

if type(value) == str:
    # Ignore errors even if the string is not proper UTF-8 or has
    # broken marker bytes.
    # Python built-in function unicode() can do this.
    value = unicode(value, "utf-8", errors="ignore")
else:
    # Assume the value object has proper __unicode__() method
    value = unicode(value)

আপনি যদি পড়তে চান তবে কেন:

http://docs.plone.org/manage/troubleshooting/unicode.html#id1


3
এটি ওপির ইস্যুতে সহায়তা করে না: "ইউ 'character u2019' অক্ষরটি এনকোড করতে পারে না"u'\u2019ইতোমধ্যে ইউনিকোড।
jfs

6

আপনার স্ক্রিপ্টের মধ্যে আপনার পরিবেশের অক্ষর এনকোডিংটিকে হার্ডকোড করবেন না; পরিবর্তে ইউনিকোড পাঠ্য সরাসরি মুদ্রণ করুন:

assert isinstance(text, unicode) # or str on Python 3
print(text)

যদি আপনার আউটপুট কোনও ফাইলে (বা পাইপ) পুনঃনির্দেশিত হয়; PYTHONIOENCODINGঅক্ষর এনকোডিং নির্দিষ্ট করতে আপনি envvar ব্যবহার করতে পারেন :

$ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8

তা না হলে, python your_script.pyযেমন কাজ করা উচিত - আপনার লোকেল সেটিংস টেক্সট এনকোড করতে ব্যবহার করা হয় (POSIX চেক করুন: LC_ALL, LC_CTYPE, LANGenvvars - সেট LANGএকটি UTF-8 লোকেল করার প্রয়োজন হলে)।

উইন্ডোজে ইউনিকোড প্রিন্ট করতে, এই উত্তরটি দেখুন যা উইন্ডোজ কনসোলে ইউনিকোড কীভাবে প্রিন্ট করতে হয়, কোনও ফাইলে বা আইডিএল ব্যবহার করে তা দেখায়


1

চমত্কার পোস্ট: http://www.carlosble.com/2010/12/ বোঝা-pthon-and-unicode /

# -*- coding: utf-8 -*-

def __if_number_get_string(number):
    converted_str = number
    if isinstance(number, int) or \
            isinstance(number, float):
        converted_str = str(number)
    return converted_str


def get_unicode(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode
    return unicode(strOrUnicode, encoding, errors='ignore')


def get_string(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode.encode(encoding)
    return strOrUnicode

0

আপনি ফর্মের কিছু ব্যবহার করতে পারেন

s.decode('utf-8')

যা কোনও ইউটিএফ -8 এনকোডেড বাইস্টেরিংকে পাইথন ইউনিকোড স্ট্রিংয়ে রূপান্তর করবে। তবে ব্যবহারের সঠিক পদ্ধতিটি নির্ভর করে আপনি কীভাবে এক্সএমএল ফাইল লোড করবেন এবং পার্স করবেন ঠিক তার উপর নির্ভর করে, উদাহরণস্বরূপ যদি আপনি কখনও এক্সএমএল স্ট্রিংটি সরাসরি অ্যাক্সেস না করেন তবে আপনাকে codecsমডিউল থেকে একটি ডিকোডার বস্তু ব্যবহার করতে হতে পারে ।


এটি ইতিমধ্যে ইউটিএফ -8 এ এনকোড করা হয়েছে ত্রুটিটি বিশেষত: মাইস্ট্রিংস = ডেক ([ইউ'ডরফ এবং স্বোবদা text u2019 এর পাঠ্যটি আরআর ... এবং কম্পিউটার ইঞ্জিনিয়ারিংয়ের সাব-সাবস্কিপলাইনগুলিতে নির্মিত হয়েছে ip ')) স্ট্রিংটি ইউটিএফ -8 হিসাবে রয়েছে আপনি দেখতে পাচ্ছেন, তবে এটি অভ্যন্তরীণ '201 u2019' সম্পর্কে উন্মাদ হয়ে যায়
অ্যালেক্স বি

ওহ, ঠিক আছে, আমি ভেবেছিলাম আপনার অন্যরকম সমস্যা হচ্ছে।
ডেভিড জেড

7
@ অ্যালেক্স বি: না, স্ট্রিংটি ইউনিকোড, ইউটিফ -8 নয়। করার এনকোড হিসাবে UTF-8 ব্যবহার এটা'...'.encode('utf-8')
হেলায়

0

উপদ্রবহীন অ্যাস্কি কোটগুলি স্থির করতে এবং ব্যবহারযোগ্য কিছুতে জোর করে রূপান্তর করতে আমি নিম্নলিখিতটি লিখেছিলাম wrote

unicodeToAsciiMap = {u'\u2019':"'", u'\u2018':"`", }

def unicodeToAscii(inStr):
    try:
        return str(inStr)
    except:
        pass
    outStr = ""
    for i in inStr:
        try:
            outStr = outStr + str(i)
        except:
            if unicodeToAsciiMap.has_key(i):
                outStr = outStr + unicodeToAsciiMap[i]
            else:
                try:
                    print "unicodeToAscii: add to map:", i, repr(i), "(encoded as _)"
                except:
                    print "unicodeToAscii: unknown code (encoded as _)", repr(i)
                outStr = outStr + "_"
    return outStr

0

আপনি যদি সেই অ-মুদ্রণযোগ্য অক্ষর উপেক্ষা না করে পর্দায় স্ট্রিংটির আনুমানিক উপস্থাপনা মুদ্রণ করতে চান তবে দয়া করে unidecodeএখানে প্যাকেজ চেষ্টা করুন:

https://pypi.python.org/pypi/Unidecode

ব্যাখ্যাটি এখানে পাওয়া যায়:

https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/

u.encode('ascii', 'ignore')প্রদত্ত স্ট্রিংয়ের জন্য এটি ব্যবহার করার চেয়ে ভাল uএবং চরিত্রের যথাযথতা যদি আপনার পরে না হয় তবে তবুও মানব পাঠযোগ্যতা পেতে চান তবে এটি আপনাকে অপ্রয়োজনীয় মাথা ব্যথা থেকে বাঁচাতে পারে।

Wirawan


-1

আপনার পাইথন স্ক্রিপ্টের শীর্ষে নীচের লাইনটি যুক্ত করার চেষ্টা করুন।

# _*_ coding:utf-8 _*_

-1

পাইথন 3.5, 2018

আপনি যদি না জানেন তবে কী এনকোডিং করছে তবে ইউনিকোড পার্সারে সমস্যা হচ্ছে আপনি ফাইলটি Notepad++এবং উপরের বারে খুলতে পারবেন Encoding->Convert to ANSI। তাহলে আপনি নিজের অজগরটি এভাবে লিখতে পারেন

with open('filepath', 'r', encoding='ANSI') as file:
    for word in file.read().split():
        print(word)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.