2012-11-21 19 views
9

Mam dykt, który jest podawany z odpowiedzią na URL. Jak:UnicodeEncodeError: Kodek 'ascii' nie może kodować znaków

>>> d 
{ 
0: {'data': u'<p>found "\u62c9\u67cf \u591a\u516c \u56ed"</p>'} 
1: {'data': u'<p>some other data</p>'} 
... 
} 

Podczas korzystania xml.etree.ElementTree funkcji na tej wartości danych (d[0]['data']) pojawia się najsłynniejszy komunikat o błędzie:

UnicodeEncodeError: 'ascii' codec can't encode characters...

Co należy zrobić, aby ten ciąg Unicode, aby nadawał się do Parser ElementTree?

PS. Proszę nie przesyłać mi linków z Unicode & Python explanation. Przeczytałem to wszystko już niestety i nie mogę z niego skorzystać, tak jak miejmy nadzieję, inni.

Odpowiedz

23

Musisz go zakodować ręcznie, na UTF-8:

ElementTree.fromstring(d[0]['data'].encode('utf-8')) 

jako API zajmuje tylko zakodowane bajty jako wejście. UTF-8 jest dobrym standardem dla takich danych.

To będzie w stanie dekodować Unicode znowu stamtąd:

>>> from xml.etree import ElementTree 
>>> p = ElementTree.fromstring(u'<p>found "\u62c9\u67cf \u591a\u516c \u56ed"</p>'.encode('utf8')) 
>>> p.text 
u'found "\u62c9\u67cf \u591a\u516c \u56ed"' 
>>> print p.text 
found "拉柏 多公 园" 
+0

Tak, to była pierwsza rzecz próbowałem i zawsze staram. Problem dotyczy 'ElementTree.tostring'. Czy możesz wypróbować 'ElementTree.tostring (p, method = 'text')' i powiedzieć, dlaczego to nie działa? Dzięki – theta

+1

Ah, przepraszam. To było zbyt oczywiste. '.tostring()' ma opcjonalny argument 'encoding', który prawdopodobnie jest domyślnie ustawiony na ascii, więc dodanie 'encoding = 'utf-8'' działa. Pozdrawiam: – theta

+0

@theta: Hehe, zaraz ci o tym opowiesz. :-) –

Powiązane problemy