Như những người khác đã nói, # coding:
chỉ định mã hóa tệp nguồn được lưu trong. Dưới đây là một số ví dụ để minh họa điều này:
Tệp được lưu trên đĩa dưới dạng cp437 (mã hóa bảng điều khiển của tôi), nhưng không có mã hóa nào được khai báo
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Đầu ra:
File "C:\ex.py", line 1
SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details
Đầu ra của tệp có # coding: cp437
thêm:
über '\x81ber'
über u'\xfcber'
Lúc đầu, Python không biết mã hóa và phàn nàn về ký tự không phải ASCII. Khi nó đã biết mã hóa, chuỗi byte nhận các byte thực sự có trên đĩa. Đối với chuỗi Unicode, Python đọc \ x81, biết rằng trong cp437 đó là ü và giải mã nó thành mã Unicode cho ü là U + 00FC. Khi chuỗi byte được in, Python đã gửi 81
trực tiếp giá trị hex đến bảng điều khiển. Khi chuỗi Unicode được in, Python đã phát hiện chính xác bảng mã của bảng điều khiển của tôi là cp437 và dịch Unicode ü sang giá trị cp437 cho ü .
Đây là những gì xảy ra với một tệp được khai báo và lưu trong UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
Trong UTF-8, ü được mã hóa dưới dạng các byte hex C3 BC
, do đó chuỗi byte chứa các byte đó, nhưng chuỗi Unicode giống với ví dụ đầu tiên. Python đọc hai byte và giải mã nó một cách chính xác. Python đã in sai chuỗi byte, vì nó đã gửi hai byte UTF-8 đại diện cho ü trực tiếp tới bảng điều khiển cp437 của tôi.
Ở đây tệp được khai báo là cp437, nhưng được lưu trong UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
Chuỗi byte vẫn có các byte trên đĩa (UTF-8 hex byte C3 BC
), nhưng diễn giải chúng thành hai ký tự cp437 thay vì một ký tự được mã hóa UTF-8. Hai ký tự đó được dịch sang các điểm mã Unicode và mọi thứ đều in không chính xác.
# coding: utf8
là đủ tốt, không cần-*-