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?
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')
'ꀀabcd޴'
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).
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
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).
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
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ł .
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
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
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 _*_
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