25

私は取得しています

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

「£」文字が含まれているため、以下の「a.desc」に格納されている文字列。これは、基になる Google App Engine データストアに Unicode 文字列として保存されるため、問題ありません。cStringIO.StringIO.writelines 関数は、ASCII 形式でエンコードしようとしているようです。

result.writelines(['blahblah',a.desc,'blahblahblah'])

それが正しい言い回しである場合、エンコーディングをユニコードとして扱うように指示するにはどうすればよいですか?

app エンジンは python 2.5 で動作します

4

4 に答える 4

38

StringIO オブジェクトをオブジェクトにラップして、codecs.StreamReaderWriterUnicode を自動的にエンコードおよびデコードできます。

このような:

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"])

bufferutf-8 でエンコードされたバイトで埋められます。

私があなたのケースを正しく理解していれば、書くだけでよいので、次のこともできます。

import cStringIO, codecs
buffer = cStringIO.StringIO()
wrapper = codecs.getwriter("utf8")(buffer)
于 2009-11-30T10:30:28.033 に答える
22

StringIO ドキュメント:

StringIO モジュールによって実装されるメモリ ファイルとは異なり、[cStringIO] によって提供されるメモリ ファイルは、プレーンな ASCII 文字列としてエンコードできない Unicode 文字列を受け入れることができません。

可能であれば、cStringIO の代わりに StringIO を使用してください。

于 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

ioPython 2.6 でこのモジュールが導入されたためio.StringIO()、「Unicode テキスト用のメモリ内ストリーム」の使用を検討する必要があります。

古いバージョンの Python ではこれは最適化されていません (純粋な Python)。それ以降のバージョンでは、これは (高速な) C コードに最適化されています。

于 2014-09-11T06:28:49.467 に答える