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

180

PEP 263 定义了如何声明 Python 源代码编码。通常情况下,一个 Python 文件的前两行应该以以下内容开头:

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

但是我看到很多文件都以以下内容开头:

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

也就是说,它会显示encoding而不是coding

应该如何声明文件的编码方式?


请使用{{link1:“SyntaxError:Non-ASCII character ...”或“SyntaxError:Non-UTF-8 code starting with ...”尝试在Python脚本中使用非ASCII文本关闭有关由于缺少或错误的编码声明而导致的语法错误的重复问题。另一方面,这个问题是关于声明如何编写以及是否必要的问题的规范问题。

6
建议使用 #!/usr/bin/env python 替代 #!/usr/bin/python,以增加代码的灵活性和可移植性。 - glarrain
8
我很喜欢这一页上的回答没有一个简单、有效的例子,比如UTF8。Stack Overflow的精髓就在于此。 - aaa90210
4
我想补充一下,Python 3已经将默认编码从ascii更改为UTF-8。可以比较一下:python 2.7文档python 3.7文档。这意味着,如果你想要指定UTF-8,可以安全地省略这个编码。 - gertvdijk
6个回答

173

在此处查看文档here:

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

建议使用以下形式的表达式:

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

这也被GNU Emacs所认可,并且

# vim:fileencoding=<encoding-name>

这段文字是有关编程的,它被Bram Moolenaar的VIM所认可。

因此,在“coding”部分之前,你可以放置几乎任何东西,但如果你想要完全符合Python文档推荐,请坚持使用“coding”(没有前缀)。

更具体地说,你需要使用Python和你使用的特定编辑软件都能够识别的内容(如果需要/接受任何内容)。例如,“coding”形式被GNU Emacs(开箱即用)识别,但不被Vim识别(是的,在没有普遍协议的情况下,这实际上是一场领土战争)。


11
-*- 确保该行可被GNU Emacs(一些程序员喜欢使用的文本编辑器)识别。请注意,与此回答相反,Emacs格式和Vim格式都是100%符合python-docs建议的兼容性(因为它们都与正则表达式匹配,“match”根据长期惯例意味着“在字符串中任意位置匹配”,这与Python的API不同)。 - martinjs
1
特定的 Emacs 要求被嵌入指令记录在 https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html 上。简而言之,文件开头的格式为: <prefix>-*- var: value[; ...] -*- - ivan_pozdeev

43

PEP 263:

第一或第二行必须匹配正则表达式 "coding[:=]\s*([-\w.]+)"

因此,"encoding: UTF-8" 符合条件。

PEP提供了一些示例:

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

 

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

42

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

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

5

截至2018年6月


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

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:

# coding=<encoding name>

or (using formats recognized by popular editors):

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

or:

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

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

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

因此,正如其他答案已经总结的那样,它将使用任何前缀与coding匹配,但如果您想尽可能符合PEP规范(尽管据我所知,使用encoding而不是coding在任何方面都不违反PEP 263),请坚持使用“普通”的coding,没有任何前缀。


0

我怀疑它与Ruby相似 - 两种方法都可以。

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

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

coding: encoding-name

忽略这些行中的任何空格和其他无关内容。(有时也可能是等于号而不是冒号。)

0

如果我没有弄错的话,原始文件编码提案是使用正则表达式来处理前几行,这样就可以同时兼容两种。

我记得正则表达式大致是以 coding: 开头之后跟着一些内容。

我找到了这个链接:http://www.python.org/dev/peps/pep-0263/ 这是原始提案,但我似乎找不到最终规范中确切的说明。

我已经成功地使用了 encoding: ,所以很明显那是可行的。

尝试完全更改为其他内容,比如 duhcoding: ...,看看是否同样有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接