Python – el codec ‘ascii’ no puede decodificar byte

Estoy usando Python 2.6 y Jinja2 para crear informes HTML. Proporciono a la plantilla muchos resultados y la plantilla los recorre y crea tablas HTML

Al llamar a template.render, de repente comencé a recibir este error.

{{result.result_str}} UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128) 

Lo extraño es que, incluso si configuro result.result_str en una cadena simple ascii como “abc” para cada resultado, todavía estoy viendo este error. Soy nuevo en Jinja2 y Python y agradecería cualquier idea sobre cómo puedo investigar el problema para llegar a la causa raíz.

Si recibe un error con una cadena como “ABC”, tal vez el carácter no ASCII esté en otra parte. ¿En la fuente de la plantilla tal vez?

En cualquier caso, use cadenas Unicode a lo largo de su aplicación para evitar este tipo de problemas. Si su fuente de datos le proporciona cadenas de bytes, obtendrá cadenas de Unicode con byte_string.decode('utf-8') , si la cadena está codificada en UTF-8. Si su fuente es un archivo, use la clase StreamReader en el módulo de codecs.

Si no está seguro de la diferencia entre las cadenas Unicode y las cadenas normales, lea esto: http://www.joelonsoftware.com/articles/Unicode.html

Intenta añadir esto:

 import sys reload(sys) sys.setdefaultencoding('utf-8') 

Se solucionó mi problema, buena suerte.

De http://jinja.pocoo.org/docs/api/#unicode

Jinja2 está utilizando Unicode internamente, lo que significa que tiene que pasar los objetos Unicode a la función de renderización o las secuencias de caracteres que solo constan de caracteres ASCII.

Entonces, donde sea que establezca result.result_str, necesita hacerlo unicode, por ejemplo

 result.result_str = unicode(my_string_variable, "utf8") 

(Si tus bytes fueron utf8 codificados en Unicode)

o

 result.result_str = u"my string" 

Acabo de encontrar el mismo problema en un fragmento de código que guarda la salida de Jinja2 a los archivos HTML:

 with open(path, 'wb') as fh: fh.write(template.render(...)) 

Es fácil culpar a Jinja2, aunque el problema real está en Python’s open() que a partir de la versión 2.7 no es compatible con UTF-8. La solución es tan simple como:

 import codecs with codecs.open(path, 'wb', 'utf-8') as fh: fh.write(template.render(...)) 

Las cadenas simples pueden contener bytes de caracteres UTF-8 pero no son de tipo Unicode. Esto puede ser arreglado por “deencoding” que convierte str a unicode. Trabaja en Python 2.5.5.

my_string_variable.decode (“utf8”)

ASCII es un código de 7 bits. El valor 0xC4 no se puede almacenar en 7 bits. Por lo tanto, está utilizando la encoding incorrecta para esos datos.

O puedes hacer

 export LANG='en_US.UTF-8' 

En tu consola donde ejecutas el script.