我得到了
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 34: ordinal not in range(128)
存储在下面'a.desc'中的字符串,因为它包含'£'字符。它作为unicode字符串存储在底层Google App Engine数据存储区中,因此没问题。 cStringIO.StringIO.writelines函数正在尝试以ascii格式对其进行编码:
result.writelines(['blahblah',a.desc,'blahblahblah'])
如果这是正确的措辞,我如何指示它将编码视为unicode? p>
app引擎在python 2.5上运行
答案 0 :(得分:38)
您可以将StringIO对象包装在codecs.StreamReaderWriter
对象中,以自动编码和解码unicode。
像这样:
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
将填充utf-8编码的字节。
如果我理解你的情况,你只需要写,所以你也可以这样做:
import cStringIO, codecs
buffer = cStringIO.StringIO()
wrapper = codecs.getwriter("utf8")(buffer)
答案 1 :(得分:22)
与StringIO模块实现的内存文件不同,[cStringIO]提供的内存文件不能接受无法编码为纯ASCII字符串的Unicode字符串。
如果可能,请使用StringIO而不是cStringIO。
答案 2 :(得分:3)
您还可以在将字符串添加到StringIO
之前手动将其编码为utf-8for val in rows:
if isinstance(val, unicode):
val = val.encode('utf-8')
result.writelines(rows)
答案 3 :(得分:0)
Python 2.6引入了io
模块,你应该考虑使用io.StringIO()
,“用于unicode文本的内存中的流。”
在较旧的python版本中,这未经过优化(纯Python),在以后的版本中,它已针对(快速)C代码进行了优化。