Domanda

Ricevo un

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

su una stringa memorizzata in 'a.desc' in quanto contiene il carattere '£'. È memorizzato nel datastore di Google App Engine sottostante come stringa unicode quindi va bene. La funzione cStringIO.StringIO.writelines sta tentando apparentemente di codificarlo in formato ASCII:

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

Come posso istruirlo sul trattamento della codifica come unicode se questa è la frase corretta?

il motore dell'app funziona su Python 2.5

È stato utile?

Soluzione

Documentazione StringIO :

  

A differenza dei file di memoria implementati dal modulo StringIO, quelli forniti da [cStringIO] non sono in grado di accettare stringhe Unicode che non possono essere codificate come semplici stringhe ASCII.

Se possibile, utilizzare StringIO invece di cStringIO.

Altri suggerimenti

Puoi avvolgere l'oggetto StringIO in un oggetto codecs.StreamReaderWriter per codificare e decodificare automaticamente unicode.

In questo modo:

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 sarà riempito con byte codificati utf-8.

Se capisco correttamente il tuo caso, dovrai solo scrivere, quindi puoi anche fare:

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

Puoi anche codificare manualmente la tua stringa come utf-8 prima di aggiungerla a StringIO

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

Python 2.6 ha introdotto il modulo io e dovresti considerare l'utilizzo di io.StringIO () , " Flusso in memoria per testo unicode. "

Nelle versioni precedenti di Python questo non è ottimizzato (Python puro), nelle versioni successive è stato ottimizzato per il codice C (veloce).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top