问题:定义Python源代码编码的正确方法
PEP 263定义了如何声明Python源代码编码。
通常,Python文件的前两行应以:
#!/usr/bin/python
# -*- coding: <encoding name> -*-
但是我看过很多以以下内容开头的文件:
#!/usr/bin/python
# -*- encoding: <encoding name> -*-
=> 编码而不是编码。
那么,声明文件编码的正确方法是什么?
是否允许使用编码,因为使用的正则表达式是惰性的?还是仅仅是声明文件编码的另一种形式?
我问这个问题是因为PEP不在谈论编码,它只是在谈论编码。
回答 0
在这里检查文档:
“如果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识别(是的,没有普遍的协议,这本质上是一场草皮大战)。
回答 1
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
只需在程序顶部的语句下面复制粘贴即可解决字符编码问题
#!/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
,没有前缀。
回答 4
如果我没记错的话,源文件编码的原始建议是在前几行中使用正则表达式,这将允许两者。
我认为正则表达式是类似coding:
的东西。
我发现了这一点:http : //www.python.org/dev/peps/pep-0263/ 这是最初的建议,但是我似乎找不到最终说明来确切说明他们的工作。
我当然已经习惯encoding:
了很大的效果,所以显然可以。
尝试更改为完全不同的内容,例如duhcoding: ...
查看是否同样有效。
回答 5
我怀疑它类似于Ruby-两种方法都可以。
这主要是因为不同的文本编辑器使用不同的标记编码方法(即,这两种)。
对于Ruby,只要是第一个,或者第二个(如果存在的话)只要包含符合以下条件的字符串即可:
coding: encoding-name
并忽略这些行上的任何空格和其他绒毛。(通常也可以是=而不是:)。