事不过三
夫战,勇气也。一鼓作气,再而衰,三而竭。——《左传·庄公十年》
作为非拉丁语系文字的使用者,我们经常要在 Python 源文件中敲方块字,于是便会遇到以下错误:
SyntaxError: Non-ASCII character '\xe6' in file yang.py on line 3, but no encoding declared;
在遥远的 Python 2.1 年代,我们只能老老实实地使用形如「\xe6\x9d\xa8\xe8\xb6\x85」这样的转义字符串来书写非 ASCII 字符。于是核心开发者 Marc-André Lemburg 大叔怒了,说要有 Unicode 支持,于是便有了「#coding:utf-8」。
默认情况下 Python 解释器使用 ASCII 编码来解析源文件,除非在第一或者第二行有如下几种形式之一的声明:
# coding=utf-8
# coding: utf-8
# -*- coding: utf-8 –*-
# vim: set fileencoding=<encoding name> :
之所以会有这么多种形式,是因为类似后面两种形式的声明顺便配置了编辑器。如果你没有配置好自己的 vim 或者 Emacs,输不进去中文也没用。注意,以上声明中的 coding 与后跟的冒号或者等号中间不能有空格,其他地方随便空。这是因为 Python 解释器会在第一行或者第二行寻找如下格式的正则表达式匹配:
coding[:=]\s*([-\w.]+)
懂正则的同学知道这就是找 coding 后面紧跟一个冒号或者等号,然后随便空格,最后跟着一个只包含连字符、大小写字母、数字和点的字符串,这个字符串会被当成源文件的编码。
最后,为了降低实现难度,以上声明只支持使用一个字节表示任意字符的编码,例如 UTF-16 就不被支持了。
码者,宅之大事,死生之地,存亡之道,不可不察也。
码者,不祥之器,非君子之器,不得已而用之...
此码非彼码也 =,=