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?

Author: juliomalegria, 2010-07-11

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')
'&#40960;abcd&#1972;'

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í).

 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/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

 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/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).

Para imprimir Unicode en Windows, vea esta respuesta que muestra cómo imprimir Unicode en la consola de Windows, en un archivo o usando 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/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
 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/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 .

 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/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
 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/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

 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/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 _*_
 -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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-20 05:08:16