Python Unicode Encode Error

Czytam i analizuję plik XML Amazon i podczas gdy plik XML pokazuje', gdy próbuję go wydrukować, dostaję następujący błąd:

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

Z tego, co do tej pory czytałem w Internecie, błąd wynika z faktu, że plik XML jest w UTF-8, ale Python chce obsłużyć go jako zakodowany znak ASCII. Czy istnieje prosty sposób, aby błąd zniknął i aby mój program wydrukował XML w trakcie odczytu?

Author: juliomalegria, 2010-07-11

8 answers

Prawdopodobnie twój problem polega na tym, że parsowałeś to dobrze, a teraz próbujesz wydrukować zawartość XML i nie możesz, ponieważ są jakieś obce znaki Unicode. Spróbuj najpierw zakodować swój ciąg znaków unicode jako ascii:

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

Część "ignoruj" powie, aby po prostu pominąć te znaki. Z python docs:

>>> 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;'

Możesz przeczytać ten artykuł: http://www.joelonsoftware.com/articles/Unicode.html , który uważam za bardzo przydatny jako podstawowy tutorial na co się dzieje? Po przeczytaniu przestaniesz czuć się, jakbyś tylko zgadywał, jakich poleceń użyć (a przynajmniej mi się to przydarzyło).

 176
Author: Scott Stafford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-04 13:56:36

Lepsze rozwiązanie:

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)

Jeśli chcesz przeczytać więcej o tym dlaczego:

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

 14
Author: Paxwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-14 00:12:33

Nie twarda kodowanie znaków środowiska wewnątrz skryptu; wydrukować tekst Unicode bezpośrednio zamiast:

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

JEŚLI wyjście jest przekierowywane do pliku (lub potoku); możesz użyć PYTHONIOENCODING envvar, aby określić kodowanie znaków:

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

W przeciwnym razie, {[3] } powinno działać tak jak jest -- twoje ustawienia regionalne są używane do kodowania tekstu (po sprawdzeniu POSIX: LC_ALL, LC_CTYPE, LANG envvars -- set LANG to a utf-8 locale if necessary).

Aby wydrukować Unicode w systemie Windows, zobacz tę odpowiedź, która pokazuje, jak wydrukować Unicode na konsoli Windows, do pliku lub używając IDLE .

 4
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:48

Doskonały post: http://www.carlosble.com/2010/12/understanding-python-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
 1
Author: Ranvijay Sachan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 18:31:37

Możesz użyć czegoś z formularza

s.decode('utf-8')

Który konwertuje kodowany przez UTF-8 bajt na ciąg Unicode Pythona. Ale dokładna procedura zależy od tego, jak dokładnie załadujesz i przeanalizujesz plik XML, np. jeśli nigdy nie uzyskasz bezpośredniego dostępu do łańcucha XML, być może będziesz musiał użyć obiektu dekodera z codecs moduł .

 0
Author: David Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-11 19:04:23

Napisałem poniżej, aby naprawić uciążliwe cudzysłowy nie-ascii i wymusić konwersję na coś użytecznego.

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
Author: user5910,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-10 11:31:11

Jeśli chcesz wydrukować przybliżoną reprezentację ciągu znaków na ekranie, zamiast ignorować te niedrukowalne znaki, spróbuj unidecode pakiet tutaj:

Https://pypi.python.org/pypi/Unidecode

Wyjaśnienie znajduje się tutaj:

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

Jest to lepsze niż użycie u.encode('ascii', 'ignore') dla danego ciągu u i może uchronić Cię przed niepotrzebnym bólem głowy jeśli precyzja znaków nie jest tym, czego szukasz, ale nadal chcesz mieć ludzką czytelność.

Wirawan

 0
Author: Wirawan Purwanto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 18:16:37

Spróbuj dodać następujący wiersz na górze skryptu Pythona.

# _*_ coding:utf-8 _*_
 -1
Author: Abhinav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-20 05:08:16