2009-12-19 45 views
6

Tôi muốn làm cho các ký tự bỏ qua python không thể mã hóa, bằng cách thay thế chúng bằng chuỗi "<could not encode>".làm cho python thay thế các ký tự không thể mã hóa bằng một chuỗi theo mặc định

ví dụ, giả sử bảng mã mặc định là ascii, lệnh

'%s is the word'%'ébác' 

sẽ mang lại

'<could not encode>b<could not encode>c is the word' 

Có cách nào để làm điều này hành vi mặc định, trên tất cả các dự án của tôi?

+0

Nếu mã hóa mặc định là ascii, mã hóa nào là chuỗi '' ébác'' trong? –

+0

@Peter Hansen - bạn nói đúng :) nó chỉ là để giải thích những gì tôi muốn ... ví dụ xấu. – olamundo

Trả lời

11

Các str.encode chức năng có một đối số tùy chọn định xử lý lỗi:

str.encode([encoding[, errors]]) 

Từ các tài liệu:

Return một phiên bản được mã hóa của chuỗi. Mã hóa mặc định là mã hóa chuỗi mặc định hiện tại. lỗi có thể được đưa ra để thiết lập một sơ đồ xử lý lỗi khác. Lỗi mặc định là 'nghiêm ngặt', có nghĩa là các lỗi mã hóa sẽ làm tăng UnicodeError. Các giá trị khác có thể là 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' và bất kỳ tên nào khác được đăng ký qua codecs.register_error(), xem phần Codec Base Classes. Để biết danh sách các mã hóa có thể, xem phần Mã hóa tiêu chuẩn.

Trong trường hợp của bạn, chức năng codecs.register_error có thể được quan tâm.

[Lưu ý về chars xấu]

Bằng cách này, lưu ý khi sử dụng register_error rằng bạn có thể sẽ thấy mình thay thế nhân vật xấu không chỉ cá nhân, nhưng nhóm nhân vật xấu liên tiếp với chuỗi của bạn, trừ khi bạn trả tiền chú ý. Bạn nhận được một cuộc gọi đến trình xử lý lỗi cho mỗi lần chạy các ký tự không hợp lệ, không phải cho mỗi char.

+0

Có những ví dụ về cách sử dụng 'codecs.register_error' trong [file test Python này] (https://github.com/python-git/python/blob/master/Lib/test/test_codeccallbacks.py). –

4
>>> help("".encode) 
Help on built-in function encode: 

encode(...) 
S.encode([encoding[,errors]]) -> object 

Encodes S using the codec registered for encoding. encoding defaults 
to the default encoding. errors may be given to set a different error 
handling scheme. Default is 'strict' meaning that encoding errors raise 
a UnicodeEncodeError. **Other possible values are** 'ignore', **'replace'** and 
'xmlcharrefreplace' as well as any other name registered with 
codecs.register_error that is able to handle UnicodeEncodeErrors. 

Vì vậy, ví dụ:

>>> x 
'\xc3\xa9b\xc3\xa1c is the word' 
>>> x.decode("ascii") 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 
>>> x.decode("ascii", "replace") 
u'\ufffd\ufffdb\ufffd\ufffdc is the word' 

Thêm callback của riêng bạn để codecs.register_error để thay thế với chuỗi của sự lựa chọn của bạn.

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