定义Python源代码编码的正确方法
定义如何声明Python源代码编码 通常,Python文件的前两行应以以下内容开头:定义Python源代码编码的正确方法,python,encoding,Python,Encoding,定义如何声明Python源代码编码 通常,Python文件的前两行应以以下内容开头: #!/usr/bin/python # -*- coding: <encoding name> -*- #/usr/bin/python #-*-编码:-*- 但我看到很多文件都是从以下内容开始的: #!/usr/bin/python # -*- encoding: <encoding name> -*- #/usr/bin/python #-*-编码:-*- =>编码而不是编码
#!/usr/bin/python
# -*- coding: <encoding name> -*-
#/usr/bin/python
#-*-编码:-*-
但我看到很多文件都是从以下内容开始的:
#!/usr/bin/python
# -*- encoding: <encoding name> -*-
#/usr/bin/python
#-*-编码:-*-
=>编码而不是编码
那么,声明文件编码的正确方法是什么
由于使用的正则表达式是惰性的,是否允许编码?或者它只是声明文件编码的另一种形式
我问这个问题是因为政治公众人物没有谈论编码,它只是谈论编码,我怀疑它与Ruby类似-任何一种方法都可以 这主要是因为不同的文本编辑器使用不同的标记编码方法(即这两种方法) 对于Ruby,只要第一行或第二行包含匹配的字符串:
coding: encoding-name
并忽略这些行上的任何空白和其他绒毛。(它通常也可以是a=而不是:)如果我没有弄错的话,源文件编码的最初建议是在前几行使用正则表达式,这将允许两者 我认为正则表达式是类似于
编码:
之后的东西
我发现:
这是最初的建议,但我似乎找不到最终的规格说明他们到底做了什么
我确实使用了编码:
效果很好,所以很明显这是可行的
尝试更改为完全不同的内容,例如duhcoding:…
,以查看这是否同样有效。检查文档:
如果Python脚本第一行或第二行中的注释与正则表达式编码[=:]\s*([-\w.]+)
匹配,则此注释将作为编码声明处理
“此表达式的推荐形式如下:
# -*- coding: <encoding-name> -*-
#-*-编码:-*-
GNU Emacs也承认了这一点,以及
# vim:fileencoding=<encoding-name>
#vim:fileencoding=
这是布拉姆·穆勒纳(Bram Moolenaar)的VIM所认可的。”
因此,您可以在“编码”部分之前放置几乎所有内容,但是如果您希望100%兼容python文档,请坚持使用“编码”(不带前缀)
更具体地说,您需要使用Python识别的任何东西和您使用的特定编辑软件(如果它需要/接受任何东西的话)。例如,编码
形式由GNU Emacs识别(开箱即用),而不是Vim(是的,没有普遍协议,它本质上是一种形式)。PEP 263:
第一行或第二行必须匹配
常客
表达式“编码[:=]\s*([-\w.]+)”
所以,“编码:UTF-8”匹配
政治公众人物提供了一些例子:
#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
只需将下面的“粘贴”语句复制到程序顶部即可。这将解决字符编码问题
#!/usr/bin/env python
# -*- coding: utf-8 -*-
截至今日-2018年6月
它本身提到了regex,如下所示: 要定义源代码编码,必须在 源文件可以是文件中的第一行或第二行,例如:
# coding=<encoding name>
因此,正如其他答案所总结的那样,它会将
编码
与任何前缀匹配,但如果您希望尽可能符合PEP(即使,据我所知,使用编码
而不是编码
在任何方面都不会违反PEP 263)-坚持“普通”编码
,没有前缀。顺便说一句,为了更灵活和可移植性,建议使用#/usr/bin/env python
而不是#/usr/bin/python
我喜欢本页的答案中没有一个简单有效的例子,比如UTF8。我只是想补充一点,Python 3已经将默认编码从ascii
更改为UTF-8
。比较:与。这意味着如果您想指定UTF-8
,可以安全地省略此编码。-*-
确保GNU Emacs(一些程序员流行的文本编辑器)可以识别该行。请注意,与此答案相反,Emacs表单和Vim表单都是100%python文档推荐兼容的(因为它们都匹配regexp—“匹配”,根据长期的惯例,意味着“匹配字符串中的任何位置”,与python的API相反)。嵌入指令的特定Emacs要求在中有说明。简而言之,文件开头的格式是:-*-var:value[;…]-*-
。
# 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]+)