我得到了一个

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 上运行

有帮助吗?

解决方案

StringIO 文档:

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

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

其他提示

您可以将 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)

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

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

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

在旧的 python 版本中,这没有优化(纯 Python),在更高的版本中,这已经优化为(快速)C 代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top