Tôi đã đọc số HOWTO on Unicode từ tài liệu chính thức và đầy đủ, rất chi tiết article. Tôi vẫn không hiểu tại sao nó lại ném cho tôi lỗi này.UnicodeEncodeError: codec 'ascii' không thể mã hóa ký tự [...]
Đây là những gì tôi cố gắng: Tôi mở một tệp XML chứa các ký tự ra khỏi phạm vi ASCII (nhưng bên trong phạm vi XML được phép). Tôi làm điều đó với cfg = codecs.open(filename, encoding='utf-8, mode='r')
chạy tốt. Nhìn vào chuỗi với repr()
cũng cho tôi thấy một chuỗi unicode.
Bây giờ tôi tiếp tục và đọc điều đó với parseString(cfg.read().encode('utf-8')
. Tất nhiên, tệp XML của tôi bắt đầu với điều này: <?xml version="1.0" encoding="utf-8"?>
. Mặc dù tôi cho rằng nó không liên quan, tôi cũng định nghĩa utf-8 cho kịch bản python của mình, nhưng vì tôi không viết các ký tự unicode trực tiếp trong nó, nên không nên áp dụng điều này ở đây. Tương tự cho các dòng sau: from __future__ import unicode_literals
cũng là ngay từ đầu.
Điều tiếp theo tôi chuyển đối tượng được tạo cho lớp của riêng mình, nơi tôi đọc thẻ thành các biến như sau: xmldata.getElementsByTagName(tagName)[0].firstChild.data
và gán cho biến trong lớp của tôi.
công trình Bây giờ những gì hoàn hảo là những lệnh (obj là một thể hiện của lớp):
for element in obj:
print element
Và lệnh này không làm việc cũng như:
print obj.__repr__()
tôi xác định __iter__()
chỉ mang mỗi biến trong khi __repr__()
sử dụng các công cụ in thông thường: "%s" % self.varname
Cả hai lệnh đều in hoàn hảo và có thể xuất ra t ông unicode nhân vật. gì không làm việc này là:
print obj
Và bây giờ tôi đang mắc kẹt vì đây ném sợ hãi
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47:
Vì vậy, những gì tôi bị mất? Tôi đang làm gì sai? Tôi đang tìm một giải pháp chung, tôi luôn luôn muốn xử lý chuỗi như unicode, chỉ để tránh bất kỳ lỗi có thể và viết một chương trình tương thích.
Chỉnh sửa: Tôi cũng định nghĩa này:
def __str__(self):
return self.__repr__()
def __unicode__(self):
return self.__repr__()
Từ tài liệu tôi rằng đây
'in obj' sẽ sử dụng' __str__' của đối tượng, không phải '__repr__'. – BrenBarn
Mã hóa mặc định của bạn là gì? Ý tôi là * sys.getdefaultencoding() * –
@BrenBarn: __str__ được thực hiện như return __repr __() – javex