2009-11-30 6 views
23

मैं एकपायथन: यूनिकोड स्ट्रिंग को स्वीकार करने के लिए StringIO.writelines कैसे प्राप्त करें?

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 34: ordinal not in range(128) 
एक स्ट्रिंग नीचे 'a.desc' में संग्रहित पर

हो रही है के रूप में यह '£' वर्ण है। यह अंतर्निहित Google App Engine डेटास्टोर में एक यूनिकोड स्ट्रिंग के रूप में संग्रहीत है, तो यह ठीक है। cStringIO.StringIO.writelines समारोह प्रतीत होता है ascii प्रारूप में सांकेतिक शब्दों में बदलना करने की कोशिश कर कोशिश कर रहा है:

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

कैसे मुझे लगता है कि यदि सही शब्दों है यह यूनिकोड के रूप में एन्कोडिंग के इलाज के लिए हिदायत करते हैं?

एप्लिकेशन इंजन अजगर 2.5

उत्तर

21

StringIO documentation पर चलता है:

स्मृति StringIO मॉड्यूल द्वारा कार्यान्वित फ़ाइलों के विपरीत, [cStringIO] द्वारा प्रदान की गई यूनिकोड स्ट्रिंग के रूप में एन्कोड नहीं किया जा सकता स्वीकार करने के लिए सक्षम नहीं हैं सादा ASCII तार।

यदि संभव हो, तो CStringIO के बजाय स्ट्रिंगियो का उपयोग करें।

+1

मैंने स्विच किया (सीस्ट्रिंगियो बेहतर प्रदर्शन-वार होने के लिए है) और इसने कोई त्रुटि नहीं डाली लेकिन केवल '£' के बजाय '£' प्रिंट किया। अब 'क्यों दिख रहा है? – rutherford

+4

'£' 0xc2 0xa3 का विंडोज -1252 डिकोडिंग है जो यू '£' का यूटीएफ -8 एन्कोडिंग है। हो सकता है कि आपका टर्मिनल, ऐप, या जहां भी आप देख रहे हों कि यूटीएफ -8 के बजाय विंडोज -1252 के लिए कॉन्फ़िगर किया गया है। – Phil

+0

हम्म। अनिवार्य रूप से मैं क्रोम ब्राउज़र के माध्यम से एक वेब सर्वर प्रतिक्रिया देख रहा हूँ। क्या यह मुद्दा होगा? – rutherford

36

आप स्ट्रिंगियो ऑब्जेक्ट को codecs.StreamReaderWriter ऑब्जेक्ट में स्वचालित रूप से एन्कोड और डीकोड करने के लिए ऑब्जेक्ट को लपेट सकते हैं।

इस तरह

:

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) 
+1

करेंगे, साथ ही, 'cStringIO.StringIO()' द्वारा लौटाई गई फ़ाइल जैसी ऑब्जेक्ट 'के साथ' कथन में काम नहीं करती है, लेकिन 'codecs.StreamReaderWriter() 'द्वारा लौटाई गई रैपर! – steveha

+0

यह https://stackoverflow.com/q/45101658/562769 जैसा लगता है - क्या आप मेरे प्रश्न का उत्तर जानते हैं? –

3

आप मैन्युअल StringIO

में जोड़ने से पहले utf-8 के रूप में अपने स्ट्रिंग सांकेतिक शब्दों में बदलना कर सकते हैं
for val in rows: 
    if isinstance(val, unicode): 
     val = val.encode('utf-8') 
result.writelines(rows) 
+2

'टाइप एक्स' के बजाय 'isinstance' का उपयोग करें – chown

0

पायथन 2.6 ने io मॉड्यूल पेश किया और आपको io.StringIO(), "यूनिकोड टेक्स्ट के लिए एक इन-मेमोरी स्ट्रीम" का उपयोग करने पर विचार करना चाहिए।

पुरानी पायथन संस्करणों में यह अनुकूलित नहीं किया गया है (शुद्ध पायथन), बाद के संस्करणों में इसे (तेज़) सी कोड के लिए अनुकूलित किया गया है।

संबंधित मुद्दे