在《Python文件的标准顺序》这篇文章中,介绍了一个Python文件标准的顺序。可以看到,Unix的shebang是优先于Python的文件编码的。本文详细介绍Python文件编码的声明。注意这里指的是Python脚本本身的编码,不是在Python中处理文件的编码。
Python程序员可能对这句话并不陌生,# -*- coding: utf-8 -*-
。并且也在自己的脚本中这样写了。为什么要写的这么花哨呢?其实,这是Emacs的编码声明,这样写可以被Emacs编辑器和Pyhton解释器都兼容。对于使用Vim的程序员,其实应该写成这样: vim: set fileencoding=<encoding name> :
。(好吧其实并没有Emacs好看)
如何声明?
在PEP263中定义了对Python源码文件编码声明。
要定义Python的源代码编码,需要在第一行或第二行编写像下面这样的“magic comment”:
# coding=<encoding name>
编码方式是以一个正则来匹配的:
1 |
^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+) |
所以如果写成下面这样,也能工作:
1 2 3 |
# awesome_encoding: utf-8 print "你好" |
其中编码的名字必须能被Python词法分析器认识,否则会报语法错误:
1 2 3 |
# coding: utf-8s SyntaxError: encoding problem: utf-8s |
如果不写,那么将使用默认的编码ASCII(python2):
1 2 |
print "你好" SyntaxError: Non-ASCII character '\xe4' in file python_2.py on line 6, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details |
但是在Python3中默认的编码是UTF-8,所以上面的代码在Python3中运行没有错误。
如何安排编码声明和shebang的顺序?
Unix系统规定,可以使用shebang指定脚本默认的编辑器。例如:
而它被如此调用(”$”是命令提示符)
1 |
$ <code>foo bar |
该命令的输出等同于
1 |
$ <code>/bin/sh -x /usr/local/bin/foo bar |
shebang的定义如下:
在计算机科学中,Shebang(也称为 Hashbang )是一个由井号和叹号构成的字符序列 #! ,其出现在文本文件的第一行的前两个字符。 在文件中存在 Shebang 的情况下,类 Unix 操作系统的程序载入器会分析 Shebang 后的内容,将这些内容作为解释器指令,并调用该指令,并将载有 Shebang 的文件路径作为该解释器的参数。
所以说shebang要求文件的第一二个字符是#!
,而Python为了兼容shebang,定义文件编码必须在第一行或第二行。
结论就很清晰了,应该先写shebang在写Python的文件编码。
配合Unicode BOM
在windows平台中,也是兼容Unicode BOM的。在文件的开头声明 \xef\xbb\xbf
表示文件是UTF-8编码。
如果同时使用了Unicode BOM和文件编码注释,则文件编码注释必须和Unicode BOM相同(UTF-8),否则抛出错误。
编码声明对 Python 3 没用了是吧。
额 不是很清楚,貌似默认是 utf-8 吧,但是不确定废弃了没有。