2012-07-01 39 views
14

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

+1

'in obj' sẽ sử dụng' __str__' của đối tượng, không phải '__repr__'. – BrenBarn

+2

Mã hóa mặc định của bạn là gì? Ý tôi là * sys.getdefaultencoding() * –

+0

@BrenBarn: __str__ được thực hiện như return __repr __() – javex

Trả lời

4

tôi cuối cùng đã giải quyết nó. Vấn đề là (tôi không chắc tại sao) nếu bạn gọi __str__() hoặc __repr__() trực tiếp nó sẽ là giấy phép để xử lý tốt, nhưng in trực tiếp (như trong: print obj) không hoạt động (mặc dù nó chỉ nên gọi __str__() chính nó).

Trợ giúp cuối cùng đến từ số này article. Tôi đã đến bước mà tôi đã nhận nó để in cho giao diện điều khiển (nhưng một lá thư sai) khi tôi sử dụng mã hóa utf-8. Cuối cùng giải quyết nó là hoàn toàn chính xác bằng cách định nghĩa này:

def __str__(self): 
    return self.__repr__().encode(stdout.encoding) 

Bây giờ câu hỏi mở duy nhất còn lại là: Tại sao print obj.__str__()print obj cách khác nhau với điều này? Nó không có ý nghĩa với tôi. Và vâng, để nhấn mạnh điều đó một lần nữa: Gọi công việc cũ hoặc __repr__() DID. Và vẫn còn với mã hóa rõ ràng.

+0

Bài viết trợ giúp không còn khả dụng – Martlark

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