Python:如何让StringIO.writelines接受unicode字符串?

时间:2009-11-30 03:23:29

标签: python string unicode ascii stringio

我得到了

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?

app引擎在python 2.5上运行

4 个答案:

答案 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 documentation

  

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

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

答案 2 :(得分:3)

您还可以在将字符串添加到StringIO

之前手动将其编码为utf-8
for 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代码进行了优化。