Python: 如何让StringIO.writelines接受Unicode字符串?
我在下面的 'a.desc' 字符串中遇到了一个问题:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 34: ordinal not in range(128)
因为它包含了 '£' 这个字符。这个字符串在 Google App Engine 的数据库中是以 unicode 格式存储的,所以这没问题。不过,cStringIO.StringIO.writelines 函数似乎在尝试把它编码成 ascii 格式:
result.writelines(['blahblah',a.desc,'blahblahblah'])
我该怎么做才能告诉它把编码当作 unicode 来处理,如果这样说是正确的话?
应用引擎运行在 Python 2.5 上。
4 个回答
4
你可以在把字符串放入StringIO之前,手动将它编码为utf-8格式。
for val in rows:
if isinstance(val, unicode):
val = val.encode('utf-8')
result.writelines(rows)
39
你可以把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)
23
和 StringIO 模块实现的内存文件不同,cStringIO 提供的内存文件不能接受那些无法转换成普通 ASCII 字符串的 Unicode 字符串。
如果可以的话,建议使用 StringIO 而不是 cStringIO。