Python脚本的编码声明

在《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>

编码方式是以一个正则来匹配的:

所以如果写成下面这样,也能工作:

其中编码的名字必须能被Python词法分析器认识,否则会报语法错误:

如果不写,那么将使用默认的编码ASCII(python2):

但是在Python3中默认的编码是UTF-8,所以上面的代码在Python3中运行没有错误。

如何安排编码声明和shebang的顺序?

Unix系统规定,可以使用shebang指定脚本默认的编辑器。例如:

而它被如此调用(”$”是命令提示符)

该命令的输出等同于

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),否则抛出错误。

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注