質問

取得しています

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

正しいフレージングである場合、エンコードをユニコードとして扱うように指示するにはどうすればよいですか?

Python 2.5で実行されるアプリエンジン

役に立ちましたか?

解決

StringIOのドキュメント

  

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

可能であれば、cStringIOの代わりにStringIOを使用します。

他のヒント

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

これに似ています:

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