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

时间:2009-04-08 07:35:05

标签: python encoding

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

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

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

但是我看到很多文件都以:

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

=&GT; 编码而不是编码

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

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

我问的是这个问题,因为PEP没有谈及编码,它只是谈论编码

6 个答案:

答案 0 :(得分:151)

检查文档here

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

“此表达式的推荐形式为

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

也被GNU Emacs认可,

# vim:fileencoding=<encoding-name>

被Bram Moolenaar的VIM认可。“

因此,您可以在“编码”部分之前添加任何内容,但如果您想要100%python-docs-recommendation兼容,请坚持使用“编码”(没有前缀)。

更具体地说,您需要使用Python 识别的任何内容以及您使用的特定编辑软件(如果它需要/接受任何内容)。例如。 GNU Emacs识别(开箱即用)coding表格,但不是Vim(是的,没有普遍协议,它基本上是turf war)。

答案 1 :(得分:36)

PEP 263:

  

第一行或第二行必须匹配   常规       表达式“coding [:=] \ 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

答案 2 :(得分:24)

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

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

答案 3 :(得分:2)

截至今天-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)-坚持使用'plain'coding,没有前缀。

答案 4 :(得分:1)

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

我认为正则表达式符合coding:后面的内容。

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

我当然使用encoding:效果很好,所以很明显可行。

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

答案 5 :(得分:0)

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

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

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

coding: encoding-name

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