Pergunta

Estou recebendo um

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

Em uma string armazenada em 'A.Desc' abaixo, pois contém o caractere '£'. Ele é armazenado no armazenamento de dados de mecanismo do Google App subjacente como uma string Unicode, então tudo bem. A função CStringio.Stringio.Writelines está tentando aparentemente tentar codificá -la no formato ASCII:

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

Como faço para instruí -lo a tratar a codificação como unicode se esse é o fraseado correto?

O App Engine é executado no Python 2.5

Foi útil?

Solução

Documentação de Stringio:

Ao contrário dos arquivos de memória implementados pelo módulo Stringio, os fornecidos por [CStringio] não podem aceitar strings Unicode que não podem ser codificados como strings ASCII simples.

Se possível, use Stringio em vez de CStringio.

Outras dicas

Você pode embrulhar o objeto Stringio em um codecs.StreamReaderWriter Objeto para codificar e decodificar automaticamente o Unicode.

Assim:

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 será preenchido com bytes codificados UTF-8.

Se eu entender o seu caso corretamente, você só precisará escrever, para que você também possa fazer:

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

Você também pode codificar sua string como UTF-8 manualmente antes de adicioná-la ao Stringio

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

Python 2.6 introduziu o io módulo e você deve considerar usar io.StringIO(), "Um fluxo na memória para texto unicode".

Nas versões mais antigas do Python, isso não é otimizado (python puro), em versões posteriores, isso foi otimizado para (rápido) o código C.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top