Pregunta

Recibo un

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 34: ordinal not in range(128)

en una cadena almacenada en 'a.desc' a continuación, ya que contiene el carácter '£'. Se almacena en el almacén de datos subyacente de Google App Engine como una cadena Unicode, por lo que está bien. La función cStringIO.StringIO.writelines está intentando codificarla en formato ascii:

result.writelines(['blahblah',a.desc,'blahblahblah'])

¿Cómo le indico que trate la codificación como unicode si esa es la redacción correcta?

el motor de la aplicación se ejecuta en python 2.5

¿Fue útil?

Solución

Documentación de StringIO :

  

A diferencia de los archivos de memoria implementados por el módulo StringIO, los proporcionados por [cStringIO] no pueden aceptar cadenas Unicode que no pueden codificarse como cadenas ASCII simples.

Si es posible, use StringIO en lugar de cStringIO.

Otros consejos

Puede envolver el objeto StringIO en un objeto codecs.StreamReaderWriter para codificar y decodificar automáticamente unicode.

Me gusta esto:

import cStringIO, codecs
buffer = cStringIO.StringIO()
codecinfo = codecs.lookup("utf8")
wrapper = codecs.StreamReaderWriter(buffer, 
        codecinfo.streamreader, codecinfo.streamwriter)

wrapper.writelines([u"list of", u"unicode strings"])

buffer se llenará con bytes codificados utf-8.

Si entiendo su caso correctamente, solo necesitará escribir, por lo que también podría hacer:

import cStringIO, codecs
buffer = cStringIO.StringIO()
wrapper = codecs.getwriter("utf8")(buffer)

También puede codificar su cadena como utf-8 manualmente antes de agregarla a StringIO

for val in rows:
    if isinstance(val, unicode):
        val = val.encode('utf-8')
result.writelines(rows)

Python 2.6 introdujo el módulo io y debería considerar usar io.StringIO () , " Una secuencia en memoria para texto unicode. "

En versiones anteriores de Python esto no está optimizado (Python puro), en versiones posteriores esto se ha optimizado para el código C (rápido).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top