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

定义Python源代码编码的正确方法,python,encoding,Python,Encoding,定义如何声明Python源代码编码 通常,Python文件的前两行应以以下内容开头: #!/usr/bin/python # -*- coding: <encoding name> -*- #/usr/bin/python #-*-编码:-*- 但我看到很多文件都是从以下内容开始的: #!/usr/bin/python # -*- encoding: <encoding name> -*- #/usr/bin/python #-*-编码:-*- =>编码而不是编码

定义如何声明Python源代码编码

通常,Python文件的前两行应以以下内容开头:

#!/usr/bin/python
# -*- coding: <encoding name> -*-
#/usr/bin/python
#-*-编码:-*-
但我看到很多文件都是从以下内容开始的:

#!/usr/bin/python
# -*- encoding: <encoding name> -*-
#/usr/bin/python
#-*-编码:-*-
=>编码而不是编码

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

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


我问这个问题是因为政治公众人物没有谈论编码,它只是谈论编码,我怀疑它与Ruby类似-任何一种方法都可以

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

对于Ruby,只要第一行或第二行包含匹配的字符串:

coding: encoding-name

并忽略这些行上的任何空白和其他绒毛。(它通常也可以是a=而不是:)

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

我认为正则表达式是类似于
编码:
之后的东西

我发现: 这是最初的建议,但我似乎找不到最终的规格说明他们到底做了什么

我确实使用了
编码:
效果很好,所以很明显这是可行的

尝试更改为完全不同的内容,例如
duhcoding:…
,以查看这是否同样有效。

检查文档:

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

“此表达式的推荐形式如下:

# -*- coding: <encoding-name> -*-
#-*-编码:-*-
GNU Emacs也承认了这一点,以及

# vim:fileencoding=<encoding-name>
#vim:fileencoding=
这是布拉姆·穆勒纳(Bram Moolenaar)的VIM所认可的。”

因此,您可以在“编码”部分之前放置几乎所有内容,但是如果您希望100%兼容python文档,请坚持使用“编码”(不带前缀)

更具体地说,您需要使用Python识别的任何东西和您使用的特定编辑软件(如果它需要/接受任何东西的话)。例如,
编码
形式由GNU Emacs识别(开箱即用),而不是Vim(是的,没有普遍协议,它本质上是一种形式)。

PEP 263:

第一行或第二行必须匹配 常客 表达式“编码[:=]\s*([-\w.]+)”

所以,“编码:UTF-8”匹配

政治公众人物提供了一些例子:

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

只需将下面的“粘贴”语句复制到程序顶部即可。这将解决字符编码问题

#!/usr/bin/env python
# -*- coding: utf-8 -*-
截至今日-2018年6月
它本身提到了regex,如下所示:

要定义源代码编码,必须在 源文件可以是文件中的第一行或第二行,例如:

# coding=<encoding name>

因此,正如其他答案所总结的那样,它会将
编码
与任何前缀匹配,但如果您希望尽可能符合PEP(即使,据我所知,使用
编码
而不是
编码
在任何方面都不会违反PEP 263)-坚持“普通”
编码
,没有前缀。

顺便说一句,为了更灵活和可移植性,建议使用
#/usr/bin/env python
而不是
#/usr/bin/python
我喜欢本页的答案中没有一个简单有效的例子,比如UTF8。我只是想补充一点,Python 3已经将默认编码从
ascii
更改为
UTF-8
。比较:与。这意味着如果您想指定
UTF-8
,可以安全地省略此编码。
-*-
确保GNU Emacs(一些程序员流行的文本编辑器)可以识别该行。请注意,与此答案相反,Emacs表单和Vim表单都是100%python文档推荐兼容的(因为它们都匹配regexp—“匹配”,根据长期的惯例,意味着“匹配字符串中的任何位置”,与python的API相反)。嵌入指令的特定Emacs要求在中有说明。简而言之,文件开头的格式是:
-*-var:value[;…]-*-
# 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]+)