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

Correct way to define Python source code encoding

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

通常,python文件的前2行应该以以下开头:

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

但我已经看到很多文件都是从以下内容开始的:

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

=>编码而不是编码。

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

是否允许编码,因为使用的regex是lazy?或者它只是声明文件编码的另一种形式?

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


在这里检查文档:

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

"此表达式的建议格式为

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

这也是GNU Emacs认可的,以及

1
# vim:fileencoding=<encoding-name>

这是由布拉姆·穆勒纳的VIM识别的。"

因此,您可以在"编码"部分前面放置几乎所有内容,但是如果您希望100%与python docs推荐兼容,请坚持"编码"(没有前缀)。

更具体地说,您需要使用Python所识别的任何东西以及您使用的特定编辑软件(如果它需要/接受任何东西的话)。例如,coding形式是由GNU Emacs(开箱即用)认可的,但不是VIM(是的,没有普遍协议,这本质上是一场地盘战争)。

  • 为什么是-*-
  • -*-确保行被gnu emacs(一个受一些程序员欢迎的文本编辑器)识别。注意,与这个答案相反,emacs表单和vim表单都是100%python-docs建议兼容的(因为它们都与regexp匹配,根据长期的惯例,"匹配"意味着"字符串中的任意位置匹配",与python的api相反)。
  • 嵌入指令的具体Emacs要求记录在gnu.org/software/emacs/manual/html_node/emacs/&hellip;上。简而言之,文件开头的格式是:
    1
    2
    3
    4
    5
    6
    7
    8
    -*- var: value[; ...] -*-</wyn></li></ul>[/collapse]</div><hr><P>PEP 263</P><blockquote>
      <p>
    the first or second line must match
      the regular
          expression"coding[:=]\s*([-\w.]+)"
    </p>
    </blockquote><P>所以,"编码:utf-8"匹配。</P><P>政治公众人物提供了一些例子:</P>[cc lang="python"]#!/usr/bin/python
    # vim: set fileencoding=<encoding name> :

    nbsp;

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


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

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

    截至今天-2018年6月

    PEP 263本身提到了以下regex:

    To define a source code encoding, a magic comment must be placed into
    the source files either as first or second line in the file, such as:

    1
    # coding=<encoding name>

    or (using formats recognized by popular editors):

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

    or:

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

    More precisely, the first or second line must match the following regular expression:

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

    因此,正如其他答案所总结的那样,它将把coding与任何前缀匹配起来,但是如果你想尽可能地符合pep(尽管,据我所知,使用encoding而不是coding不会以任何方式违反pep 263),那么就坚持使用"plain"coding,不带前缀。


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

    我认为regex是沿着coding:的线,后面跟着一些东西。

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

    我确实用过encoding:来达到很好的效果,所以很明显这是可行的。

    试着换个完全不同的东西,比如duhcoding: ...,看看是否也能奏效。


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

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

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

    1
    coding: encoding-name

    忽略那些行中的空白和其他绒毛。(通常也可以是a=而不是:,)。