Python:StringIO.writelinesを取得してUnicode文字列を受け入れる方法は?
質問
取得しています
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モジュールによって実装されるメモリファイルとは異なり、[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コードに最適化されています。
所属していません StackOverflow