正如其他人所说,# 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