2012-06-15 39 views
6

Tôi có các tập lệnh in ra thông báo bằng hệ thống ghi nhật ký hoặc đôi khi lệnh in. Trên Windows console tôi nhận được thông báo lỗi nhưNgăn chặn lỗi mã hóa bằng Python

Traceback (most recent call last): 
    File "C:\Python32\lib\logging\__init__.py", line 939, in emit 
    stream.write(msg) 
    File "C:\Python32\lib\encodings\cp850.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u2019' in position 4537:character maps to <undefined> 

Có một cách tổng quát để làm cho tất cả các mã hóa trong hệ thống khai thác gỗ, lệnh in vv không an toàn (bỏ qua lỗi)?

Trả lời

9

Vấn đề là thiết bị đầu cuối/vỏ của bạn (cmd như bạn đang ở trên Windows) không thể in mọi ký tự Unicode.

Bạn có thể mã hóa an toàn các chuỗi của mình bằng đối số errors của phương pháp str.encode. Ví dụ: bạn có thể thay thế các ký tự không được hỗ trợ bằng cách errors='replace'.

>>> s = u'\u2019' 
>>> print s 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\encodings\cp850.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can\'t encode character u'\u2019' in position 
0: character maps to <undefined> 
>>> print s.encode('cp850', errors='replace') 
? 

Xem documentation để biết các tùy chọn khác.

Sửa Nếu bạn muốn có một giải pháp chung cho khai thác gỗ, bạn có thể phân lớp StreamHandler:

class CustomStreamHandler(logging.StreamHandler): 

    def emit(self, record): 
     record = record.encode('cp850', errors='replace') 
     logging.StreamHandler.emit(self, record) 
+0

Nhưng nếu tôi mã hóa trước khi tất cả các chuỗi họ thay đổi loại (để byte) mà có thể thay đổi hành vi của họ trong Nội địa? Ngoài ra, nó nằm trong thư viện codec cài sẵn. Tôi không thể thay đổi điều đó. Tôi có thể đặt tùy chọn trong codec không? – Gerenuk

+0

Bạn chỉ cần mã hóa chúng trước khi in/ghi nhật ký. – schlamar

+0

Đã chỉnh sửa câu trả lời của tôi bằng giải pháp ghi nhật ký chung. – schlamar

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