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


163

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

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

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

但是我看过很多以以下内容开头的文件:

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

=> 编码而不是编码

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

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

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


4
顺便说一句,有更多的灵活性和可移植性,建议使用#!/usr/bin/env python,而不是#!/usr/bin/python
glarrain

7
我喜欢此页面上的所有答案都没有一个简单的,可以说UTF8的示例。最好的StackOverly。
aaa90210'1-3-16

2
我只是想补充一点,Python 3已将默认编码从更改asciiUTF-8。比较:python 2.7 docspython 3.7 docs。这意味着您可以安全地省略此编码(如果要指定)UTF-8
gertvdijk

Answers:


161

这里检查文档:

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

“此表述的推荐形式是

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

GNU Emacs也认识到这一点,并且

# vim:fileencoding=<encoding-name>

被Bram Moolenaar的VIM认可。”

因此,您可以在“编码”部分之前放置几乎所有内容,但是如果要100%兼容python-docs-recommendation,则应坚持使用“编码”(无前缀)。

更具体地说,您需要使用Python可以识别的任何东西以及您使用的特定编辑软件(如果它完全需要/接受任何东西)。例如,coding表格被GNU Emacs识别(开箱即用),但未被Vim识别(是的,没有普遍的协议,这本质上是一场草皮大战)。


10
为什么-*-呢?
Iulian Onofrei 2015年

10
-*-确保线路由GNU Emacs的(一个文本编辑器很受一些程序员)的认可。请注意,与该答案相反,Emacs形式和Vim形式都是100%python-docs-recommendation-compatible(因为它们都与regexp相匹配-按照长期的惯例,“ match”表示“字符串”,与Python的API相反)。
martinjs 2015年

1
嵌入式指令对Emacs的特定要求记录在gnu.org/software/emacs/manual/html_node/emacs/…中。简而言之,文件开头的格式为:<prefix>-*- var: value[; ...] -*-
ivan_pozdeev '16

38

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

31

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

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

3

截至今天-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,没有前缀。


1

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

我认为正则表达式是类似coding:的东西。

我发现了这一点:http : //www.python.org/dev/peps/pep-0263/ 这是最初的建议,但是我似乎找不到最终说明来确切说明他们的工作。

我当然已经习惯encoding:了很大的效果,所以显然可以。

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


0

我怀疑它类似于Ruby-两种方法都可以。

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

对于Ruby,只要是第一个,或者第二个(如果存在的话)只要包含符合以下条件的字符串即可:

coding: encoding-name

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.