Error de Codificación de Python Unicode
Estoy leyendo y analizando un archivo XML de Amazon y mientras el archivo XML muestra un', cuando intento imprimirlo obtengo el siguiente error:
'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128)
Por lo que he leído en línea hasta ahora, el error proviene del hecho de que el archivo XML está en UTF-8, pero Python quiere manejarlo como un carácter codificado en ASCII. ¿Hay una manera sencilla de hacer que el error desaparezca y hacer que mi programa imprima el XML como se lee?
8 answers
Probablemente, tu problema es que lo analizaste bien, y ahora estás tratando de imprimir el contenido del XML y no puedes porque hay algunos caracteres Unicode extranjeros. Primero intenta codificar tu cadena unicode como ascii:
unicodeData.encode('ascii', 'ignore')
La parte 'ignorar' le dirá que simplemente omita esos caracteres. De los documentos de python:
>>> 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޴'
Es posible que desee leer este artículo: http://www.joelonsoftware.com/articles/Unicode.html , que me pareció muy útil como un tutorial básico sobre qué está pasando. Después de la lectura, dejarás de sentir que solo estás adivinando qué comandos usar (o al menos eso me pasó a mí).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-04 13:56:36
Una mejor solución:
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)
Si desea leer más sobre por qué:
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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-14 00:12:33
No codifique la codificación de caracteres de su entorno dentro de su script; imprima texto Unicode directamente en su lugar:
assert isinstance(text, unicode) # or str on Python 3
print(text)
Si su salida se redirige a un archivo( o una tubería); puede usar PYTHONIOENCODING
envvar, para especificar la codificación de caracteres:
$ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8
De lo contrario, python your_script.py
debería funcionar como está your sus ajustes de configuración regional se utilizan para codificar el texto (en la comprobación POSIX: LC_ALL
, LC_CTYPE
, LANG
envvars set establece LANG
a una configuración regional utf-8 si es necesario).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:48
Excelente 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-13 18:31:37
Puedes usar algo de la forma
s.decode('utf-8')
Que convertirá un bytestring codificado en UTF-8 en una cadena Unicode de Python. Pero el procedimiento exacto a utilizar depende de exactamente cómo cargar y analizar el archivo XML, por ejemplo, si nunca accede a la cadena XML directamente, es posible que tenga que utilizar un objeto decodificador de la codecs
módulo .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-11 19:04:23
Escribí lo siguiente para arreglar las comillas no ascii molestas y forzar la conversión a algo utilizable.
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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-10 11:31:11
Si necesita imprimir una representación aproximada de la cadena en la pantalla, en lugar de ignorar esos caracteres no imprimibles, intente unidecode
paquete aquí:
Https://pypi.python.org/pypi/Unidecode
La explicación se encuentra aquí:
Https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/
Esto es mejor que usar u.encode('ascii', 'ignore')
para una cadena dada u
, y puede ahorrarle un dolor de cabeza innecesario si la precisión del carácter no es lo que buscas, pero aún así quieres tener legibilidad humana.
Wirawan
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-23 18:16:37
Intente agregar la siguiente línea en la parte superior de su script python.
# _*_ 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-20 05:08:16