2012-07-01 20 views
14

He leído el HOWTO on Unicode de los documentos oficiales y un completo y muy detallado article también. Aún no entiendo por qué me arroja este error.UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter [...]

Aquí es lo que intento: abro un archivo XML que contiene caracteres fuera del rango ASCII (pero dentro de rango XML permitido). Lo hago con cfg = codecs.open(filename, encoding='utf-8, mode='r'), que funciona bien. Mirar la cadena con repr() también me muestra una cadena Unicode.

Ahora seguir adelante y leer que con parseString(cfg.read().encode('utf-8'). Por supuesto, mi archivo XML comienza con esto: <?xml version="1.0" encoding="utf-8"?>. Aunque supongo que no es relevante, también definido UTF-8 para mi script en Python, pero como yo no escribo caracteres Unicode directamente en ella, esto no debería aplicarse aquí. Lo mismo para la siguiente línea: from __future__ import unicode_literals que también es justo al principio.

Lo siguiente que paso el Objeto generado a mi propia clase donde leo etiquetas en variables como esta: xmldata.getElementsByTagName(tagName)[0].firstChild.data y lo asigno a una variable en mi clase.

Ahora qué perfección obras son aquellos comandos (obj es una instancia de la clase):

for element in obj: 
    print element 

Y este comando funciona así:

print obj.__repr__() 

he definido __iter__() simplemente producir cada variable, mientras que __repr__() utiliza las funciones típicas de printf: "%s" % self.varname

Ambos comandos se imprimen perfectamente y pueden generar t él unicode personaje. Lo que no funciona es la siguiente:

print obj 

Y ahora estoy atascado debido a esto arroja el temido

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47: 

Entonces, ¿qué me falta? ¿Qué estoy haciendo mal? Busco a una solución general, siempre quiero manejar cadenas como Unicode, sólo para evitar posibles errores y escribir un programa compatible.

Edit: También se define la siguiente:

def __str__(self): 
    return self.__repr__() 
def __unicode__(self): 
    return self.__repr__() 

De la documentación que tengo que esta

+1

'print obj' usará el objeto' __str__', no '__repr__'. – BrenBarn

+2

¿Cuál es su codificación predeterminada? Me refiero a * sys.getdefaultencoding() * –

+0

@BrenBarn: __str__ se implementa como return __repr __() – javex

Respuesta

4

que finalmente resolvió. El problema era (no estoy seguro por qué) que si llamabas __str__() o __repr__() directamente, sería conveniente manejarlo bien, pero imprimirlo directamente (como en: print obj) no funciona (aunque solo debería llamar al __str__() mismo)

El final de ayuda vino de esta article. Ya llegué al paso donde lo tengo para imprimir en la consola (pero una letra incorrecta) cuando utilicé la codificación utf-8. Finalmente resolvió que era perfectamente correcta mediante la definición siguiente:

def __str__(self): 
    return self.__repr__().encode(stdout.encoding) 

Ahora la única pregunta abierta que queda es: ¿Por qué print obj.__str__() y print obj diferente con esto? No tiene sentido para mí. Y sí, para enfatizar eso de nuevo: Llamando al primero o __repr__() HIZO el trabajo. Y aún lo hace con la codificación explícita.

+0

El artículo de ayuda ya no está disponible – Martlark

Cuestiones relacionadas