定义 Python 源代码编码的正确方法

PEP 263 定义了如何声明 Python 源代码编码。

通常,Python 文件的前两行应该以:

#!/usr/bin/python
# -*- coding: <encoding name> -*-

但我看过很多文件都是这样开头的:

#!/usr/bin/python
# -*- encoding: <encoding name> -*-

= > 编码而非 编码

那么,声明文件编码的正确方法是什么呢?

是否允许 编码,因为使用的正则表达式是惰性的? 或者它只是声明文件编码的另一种形式?

我问这个问题是因为 PEP 不谈论 编码,它只谈论 编码

92703 次浏览

我怀疑它与 Ruby 类似——任何一种方法都可以。

这主要是因为不同的文本编辑器使用不同的标记编码方法(即这两种方法)。

使用 Ruby 时,只要第一个或第二个(如果有一个 shebang 行包含匹配的字符串) :

coding: encoding-name

忽略这些行上的任何空格和其他无关紧要的东西。(也可以是 a = 而不是: ,)。

如果我没有弄错的话,源文件编码的最初建议是对前两行使用正则表达式,这将允许两者兼容。

我认为正则表达式是沿着 coding:的路线,后面跟着一些东西。

我发现了这样一个 http://www.python.org/dev/peps/pep-0263/ : 这是最初的提案,但我似乎找不到最终规格说明他们具体做了什么。

我当然已经使用 encoding:取得了很大的效果,所以显然这是有效的。

尝试改变一些完全不同的东西,比如 duhcoding: ...,看看它是否同样有效。

检查文件 给你:

”如果 Python 脚本第一行或第二行中的注释与正则表达式 coding[=:]\s*([-\w.]+)匹配,则将该注释作为编码声明处理

”这个表达的推荐形式是

# -*- coding: <encoding-name> -*-

它也被 GNU Emacs 识别,并且

# vim:fileencoding=<encoding-name>

布拉姆 · 穆勒纳尔的 VIM 认出了它

因此,您可以在“编码”部分之前放置几乎任何内容,但是如果您想要100% 地与 python-docs- 推荐兼容,那就只能放在“代码”部分(沒有前缀)之前。

更具体地说,您需要使用 Python 以及您使用的特定编辑软件识别的任何内容(如果它需要/接受任何内容的话)。例如,coding表单被 GNU Emacs 认可(开箱即用) ,但不被 Vim 认可(是的,如果没有通用协议,它本质上就是 地盘争夺战)。

PEP 263:

第一行或第二行必须匹配 普通的 表达式“ code [ : = ] s * ([-w. ] +)”

“ en编码: UTF-8”匹配。

PEP 提供了一些例子:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

# This Python file uses the following encoding: utf-8
import os, sys

只要将下面的语句复制到程序顶部,就可以解决字符编码问题了

#!/usr/bin/env python
# -*- coding: utf-8 -*-

从今天开始2018年6月


PEP 263 本身提到了它所遵循的正则表达式:

要定义源代码编码,必须在 将源文件作为文件中的第一行或第二行,例如:

# coding=<encoding name>

或(使用流行编辑认可的格式) :

#!/usr/bin/python
# -*- coding: <encoding name> -*-

或:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

更确切地说,第一行或第二行必须与下列正则表达式匹配:

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

因此,正如其他答案已经总结的那样,它可以匹配 coding的任何前缀,但是如果你想要尽可能地兼容 PEP (尽管,就我所知,使用 encoding而不是 coding并不违反 PEP 263的任何方式)-坚持使用“普通的”coding,没有前缀。