正如其他人所说,# 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
加上 # 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: utf-8
。 - Samuel Harmer#coding=utf-8
。https://www.python.org/dev/peps/pep-0263/ - Guangtong Shen