25

我得到一个

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?

应用引擎在 python 2.5 上运行

4

4 回答 4

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)
于 2009-11-30T10:30:28.033 回答
22

StringIO 文档

与 StringIO 模块实现的内存文件不同,[cStringIO] 提供的内存文件不能接受无法编码为纯 ASCII 字符串的 Unicode 字符串。

如果可能,请使用 StringIO 而不是 cStringIO。

于 2009-11-30T03:39:32.493 回答
4

您还可以在将字符串添加到 StringIO 之前手动将其编码为 utf-8

for val in rows:
    if isinstance(val, unicode):
        val = val.encode('utf-8')
result.writelines(rows)
于 2012-05-11T07:24:08.333 回答
0

Python 2.6 引入了该io模块,您应该考虑使用io.StringIO()“用于 unicode 文本的内存流”。

在较旧的 python 版本中,这未优化(纯 Python),在更高版本中,这已针对(快速)C 代码进行了优化。

于 2014-09-11T06:28:49.467 回答