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
'print obj' usará el objeto' __str__', no '__repr__'. – BrenBarn
¿Cuál es su codificación predeterminada? Me refiero a * sys.getdefaultencoding() * –
@BrenBarn: __str__ se implementa como return __repr __() – javex