بايثون:كيفية الحصول على StringIO.writelines لقبول unicode السلسلة ؟

StackOverflow https://stackoverflow.com/questions/1817695

سؤال

أنا الحصول على

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

على سلسلة المخزنة في'.desc' أدناه كما أنه يحتوي على '£' حرف.إنه الكامنة المخزنة في محرك جوجل التطبيق مخزن البيانات مثل سلسلة unicode فلا بأس.على cStringIO.StringIO.writelines وظيفة في محاولة على ما يبدو يحاول صياغته في شكل ascii:

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

كيف يمكنني إرشاد إلى علاج ترميز unicode إذا كان هذا هو الصحيح والصياغة?

التطبيق محرك يعمل على بايثون 2.5

هل كانت مفيدة؟

المحلول

StringIO الوثائق :

<اقتباس فقرة>   

وخلافا لملفات الذاكرة التي تنفذها وحدة StringIO، تلك التي توفرها [cStringIO] لم تكن قادرا على تقبل سلاسل Unicode التي لا يمكن المشفرة كسلاسل ASCII عادي.

وإذا كان ذلك ممكنا، استخدم StringIO بدلا من cStringIO.

نصائح أخرى

ويمكنك لف الكائن StringIO في كائن 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)

ويمكنك أيضا ترميز سلسلة الخاص بك ك UTF-8 يدويا قبل إضافتها إلى StringIO

for val in rows:
    if isinstance(val, unicode):
        val = val.encode('utf-8')
result.writelines(rows)

بيثون 2.6 قدم io وحدة و يجب عليك النظر في استخدام io.StringIO(), "،وهو في الذاكرة تيار نص unicode."

في السن إصدارات بيثون هذا ليس الأمثل (الثعبان النقي) في الإصدارات اللاحقة وقد تم تحسين (سريع) ج التعليمات البرمجية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top