2012-11-21 60 views
9

Tôi có một dict là nguồn cấp dữ liệu có phản hồi url. Giống như:UnicodeEncodeError: codec 'ascii' không thể mã hóa các ký tự

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

Trong khi sử dụng xml.etree.ElementTree chức năng trên các giá trị dữ liệu này (d[0]['data']) Tôi nhận được thông báo lỗi nổi tiếng nhất:

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

Tôi nên làm gì để chuỗi Unicode này để làm cho nó phù hợp cho Trình phân tích cú pháp ElementTree?

PS. Vui lòng không gửi cho tôi các liên kết có giải thích bằng Python & Python. Tôi đã đọc nó tất cả đã không may, và không thể sử dụng nó, như hy vọng những người khác có thể.

Trả lời

23

Bạn sẽ phải mã hóa nó bằng tay, sang UTF-8:

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

như API byte chỉ mất mã hóa như đầu vào. UTF-8 là một mặc định tốt cho dữ liệu đó.

Nó sẽ có thể giải mã sang Unicode một lần nữa từ đó:

>>> 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

Vâng, đó là điều đầu tiên tôi đã cố gắng và tôi luôn cố gắng. Vấn đề là với 'ElementTree.tostring'. Bạn có thể thử 'ElementTree.tostring (p, method = 'text')' và nói tại sao nó không hoạt động? Cảm ơn – theta

+1

Ah, xin lỗi. Nó quá rõ ràng. '.tostring()' có đối số tùy chọn 'encoding' có thể được đặt thành ascii theo mặc định, vì vậy việc thêm 'encoding = 'utf-8'' hoạt động. Chúc mừng – theta

+0

@theta: Hehe, sắp kể cho bạn nghe về điều đó. :-) –

Các vấn đề liên quan