就像其他人所说的,# 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错误地打印了字节字符串,因为它直接将代表ü的两个UTF-8字节发送到了我的cp437控制台。
在这里,该文件被声明为cp437,但保存在UTF-8中:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
字节字符串仍然在磁盘上获得了字节(UTF-8十六进制字节C3 BC
),但是将它们解释为两个cp437字符,而不是单个UTF-8编码的字符。转换为Unicode代码点的那两个字符,所有内容打印不正确。
# coding: utf8
足够好,不需要-*-