2009-11-30 25 views
23

Ben '£' karakter içeriyor olarak aşağıdaki 'a.desc' saklanan bir ipe birPython: Unicode dizesini kabul etmek için StringIO.writelines nasıl edinilir?

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

alıyorum. Temel Google App Engine veri deposunda bir unicode dizesi olarak depolanır, bu da sorun değil. cStringIO.StringIO.writelines fonksiyonu görünüşte ASCII formatında kodlamak için çalışıyor çalışıyor:

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

Bunu nasıl doğru cümleleme eğer o Unicode olarak kodlamayı tedavi etmek bildiririm?

uygulama motoru piton 2.5

cevap

21

StringIO documentation çalışır: StringIO modülü tarafından uygulanan bellek dosyalarının aksine

, [cStringIO] tarafından sağlananlar gibi kodlanmış edilemez Unicode dizeleri kabul etmek mümkün değildir düz ASCII dizeleri. Mümkünse

, StringIO yerine cStringIO kullanın.

+1

ve bunun yerine sadece '£' baskı 'Â £' hata atmak vermedi ama (cStringIO daha iyi performans akıllıca olması gerekiyordu). 'Â' neden şimdi gösteriliyor? – rutherford

+4

'Â £' '£' u UTF-8 kodlama 0xC2 0xa3 Windows-1252 kod çözme olduğunu. Belki de terminaliniz, uygulamanız veya nerede görüyorsanız, UTF-8 yerine Windows-1252 için yapılandırılmış olabilir. – Phil

+0

hmm. Esasen Chrome tarayıcısı üzerinden bir web sunucusu yanıtına bakıyorum. Sorun bu muydu? – rutherford

36

otomatik kodlamak ve unicode kodunu çözmek için bir codecs.StreamReaderWriter nesnede StringIO nesneyi kaydırılabilir. Bunun gibi

:

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 kodlu byte ile doldurulacaktır.

Ben doğru durumda anlamak, yalnızca yazmak gerekir, bu nedenle de yapabilirdi:

import cStringIO, codecs 
buffer = cStringIO.StringIO() 
wrapper = codecs.getwriter("utf8")(buffer) 
+1

Ayrıca, cStringIO.StringIO() 'tarafından döndürülen dosya benzeri nesne' with' ifadesinde çalışmıyor, ancak 'codecs.StreamReaderWriter() 'tarafından döndürülen sarmalayıcı yok! – steveha

+0

Bu, https://stackoverflow.com/q/45101658/562769 adresine benzer geliyor - sorumu yanıtlıyor musunuz? –

3

el ile de StringIO

eklemeden önce utf-8 olarak dize kodlamak
for val in rows: 
    if isinstance(val, unicode): 
     val = val.encode('utf-8') 
result.writelines(rows) 
+2

, 'isinstance' yerine' type is X 'yazın – chown

0

Python 2.6 io modülünü tanıttı ve io.StringIO(), kullanmayı düşünmelisiniz "unicode metin için bir bellek içi akışı."

eski piton sürümlerinde bu optimize edilmemiş (saf Python), daha sonraki sürümlerinde bu (hızlı) C koduna şekilde optimize edilmiştir. Ben açık

İlgili konular