正如其他人所說,# coding:
指定源文件保存在其中的編碼。下面是一些例子來說明這一點:
保存在磁盤上爲CP437(我的控制檯編碼)的文件,但沒有宣佈編碼
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
輸出:
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
與# coding: cp437
文件輸出增加:
über '\x81ber'
über u'\xfcber'
起初,Python不知道編碼並抱怨非ASCII字符。一旦知道了編碼,字節串就會得到實際在磁盤上的字節。對於Unicode字符串,Python讀取\ x81,知道在cp437中是ü,並將其解碼爲Unicode碼點ü即U + 00FC。當打印字節字符串時,Python將十六進制值81
直接發送到控制檯。當打印Unicode字符串時,Python正確地檢測到我的控制檯編碼爲cp437,並將Unicode ü轉換爲ü的cp437值。
下面是與申報,並保存在一個文件中會發生什麼UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
在UTF-8,ü被編碼爲十六進制字節C3 BC
,所以字節字符串包含這些字節,但Unicode字符串與第一個示例相同。 Python讀取兩個字節並正確解碼。 Python錯誤地打印了字節串,因爲它直接向我的cp437控制檯發送了代表ü的兩個UTF-8字節。
這裏,文件被宣佈CP437,但保存在UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
字節串仍然有磁盤上的字節(UTF-8十六進制字節C3 BC
),但解釋他們兩個cp437字符而不是單個UTF-8編碼字符。這兩個字符轉換爲Unicode代碼點,並且所有東西都打印錯誤。
'#編碼:utf8'足夠好,無需' - * - ' – jellyfish 2016-02-03 11:40:59
@jellyfish我假設你想鍵入'#編碼:UTF -8'。 – 2017-12-07 20:30:34
應該是'#coding = utf-8'。 https://www.python.org/dev/peps/pep-0263/ – 2017-12-18 22:24:51