Thông báo lỗi cho bạn biết chính xác những gì sai. Trình thông dịch Python cần biết mã hóa ký tự không phải ASCII.
Nếu bạn muốn trả về U + 00A3 thì bạn có thể nói
return u'\u00a3'
đại diện cho ký tự này trong ASCII thuần túy bằng chuỗi thoát Unicode. Nếu bạn muốn trả về một chuỗi byte chứa byte bằng 0xA3, thì đó là
return b'\xa3'
(trong Python 2 b
thì ẩn; nhưng rõ ràng là tốt hơn ẩn).
PEP được liên kết trong thông báo lỗi hướng dẫn bạn chính xác cách nói với Python "tệp này không phải là ASCII thuần túy; đây là mã hóa tôi đang sử dụng". Nếu mã hóa là UTF-8, đó sẽ là
# coding=utf-8
hoặc tương thích Emacs
# -*- encoding: utf-8 -*-
Nếu bạn không biết trình mã hóa nào mà trình soạn thảo của bạn sử dụng để lưu tệp này, hãy kiểm tra nó với một cái gì đó như trình soạn thảo hex và một số googling. Tràn ngăn xếpmã hóa ký tựThẻ có trang thông tin thẻ với nhiều thông tin hơn và một số mẹo khắc phục sự cố.
Trong rất nhiều từ, ngoài phạm vi ASCII 7 bit (0x00-0x7F), Python không thể và không đoán được chuỗi chuỗi nào biểu thị chuỗi nào. https://tripleee.github.io/8bit#a3 hiển thị 21 cách hiểu có thể có cho byte 0xA3 và đó chỉ là từ mã hóa 8 bit cũ; nhưng nó cũng rất có thể là byte đầu tiên của mã hóa nhiều byte. Nhưng trên thực tế, tôi đoán bạn thực sự đang sử dụng Latin-1, vì vậy bạn nên có
# coding: latin-1
là dòng đầu tiên hoặc thứ hai của tệp nguồn của bạn. Dù sao, nếu không có kiến thức về ký tự mà byte được cho là đại diện, một con người cũng sẽ không thể đoán được điều này.
Thông báo trước: coding: latin-1
chắc chắn sẽ xóa thông báo lỗi (vì không có chuỗi byte nào không được phép về mặt kỹ thuật trong mã hóa này), nhưng có thể tạo ra kết quả hoàn toàn sai khi mã được diễn giải nếu mã hóa thực tế là thứ khác. Bạn thực sự phải biết mã hóa tệp với sự chắc chắn hoàn toàn khi bạn khai báo mã hóa.