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

rut*_*ord 24 python string unicode ascii stringio

我得到了一个

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 34: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

存储在'a.desc'中的字符串,因为它包含'£'字符.它作为unicode字符串存储在底层Google App Engine数据存储区中,因此没问题.cStringIO.StringIO.writelines函数试图似乎试图以ascii格式对其进行编码:

result.writelines(['blahblah',a.desc,'blahblahblah'])
Run Code Online (Sandbox Code Playgroud)

如果这是正确的措辞,我如何指示它将编码视为unicode?

app引擎在python 2.5上运行

cod*_*ape 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"])
Run Code Online (Sandbox Code Playgroud)

buffer 将填充utf-8编码的字节.

如果我理解你的情况,你只需要写,所以你也可以这样做:

import cStringIO, codecs
buffer = cStringIO.StringIO()
wrapper = codecs.getwriter("utf8")(buffer)
Run Code Online (Sandbox Code Playgroud)


Phi*_*hil 22

StringIO文档:

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

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

  • '£'是0xc2 0xa3的Windows-1252解码,它是u'£'的UTF-8编码.也许您的终端,应用程序或任何您看到的地方都配置为Windows-1252而不是UTF-8. (4认同)
  • 不.在这方面,ISO-8859-1的行为与Windows-1252相同.您可能希望在页眉中明确设置UTF-8编码,以便浏览器不必猜测编码.(当然,除非您的应用中的其他内容已经在非UTF-8编码中生成输出.) (3认同)