Correct way to define Python source code encoding
PEP263定义了如何声明Python源代码编码。
通常,python文件的前2行应该以以下开头:
1 2 | #!/usr/bin/python # -*- coding: <encoding name> -*- |
但我已经看到很多文件都是从以下内容开始的:
1 2 | #!/usr/bin/python # -*- encoding: <encoding name> -*- |
=>编码而不是编码。
那么,声明文件编码的正确方法是什么呢?
是否允许编码,因为使用的regex是lazy?或者它只是声明文件编码的另一种形式?
我问这个问题是因为PEP不讨论编码,它只讨论编码。
在这里检查文档:
如果python脚本第一行或第二行中的注释与正则表达式
"此表达式的建议格式为
1 | # -*- coding: <encoding-name> -*- |
这也是GNU Emacs认可的,以及
1 | # vim:fileencoding=<encoding-name> |
这是由布拉姆·穆勒纳的VIM识别的。"
因此,您可以在"编码"部分前面放置几乎所有内容,但是如果您希望100%与python docs推荐兼容,请坚持"编码"(没有前缀)。
更具体地说,您需要使用Python所识别的任何东西以及您使用的特定编辑软件(如果它需要/接受任何东西的话)。例如,
- 为什么是
-*- ? -*- 确保行被gnu emacs(一个受一些程序员欢迎的文本编辑器)识别。注意,与这个答案相反,emacs表单和vim表单都是100%python-docs建议兼容的(因为它们都与regexp匹配,根据长期的惯例,"匹配"意味着"字符串中的任意位置匹配",与python的api相反)。- 嵌入指令的具体Emacs要求记录在gnu.org/software/emacs/manual/html_node/emacs/&hellip;上。简而言之,文件开头的格式是:1
2
3
4
5
6
7
8-*- var: value[; ...] -*-</wyn>。</li></ul>[/collapse]</div><hr><P>PEP 263:</P><blockquote>
<p>
the first or second line must match
the regular
expression"coding[:=]\s*([-\w.]+)"
</p>
</blockquote><P>所以,"编码:utf-8"匹配。</P><P>政治公众人物提供了一些例子:</P>[cc lang="python"]#!/usr/bin/python
# vim: set fileencoding=<encoding name> :nbsp;
1
2# This Python file uses the following encoding: utf-8
import os, sys只需将下面的语句复制粘贴到程序顶部即可。它将解决字符编码问题。
1
2#!/usr/bin/env python
# -*- coding: utf-8 -*-
截至今天-2018年6月PEP 263本身提到了以下regex:
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:1# coding=<encoding name>or (using formats recognized by popular editors):
1
2#!/usr/bin/python
# -*- coding: <encoding name> -*-or:
1
2#!/usr/bin/python
# vim: set fileencoding=<encoding name> :More precisely, the first or second line must match the following regular expression:
1^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)因此,正如其他答案所总结的那样,它将把
coding 与任何前缀匹配起来,但是如果你想尽可能地符合pep(尽管,据我所知,使用encoding 而不是coding 不会以任何方式违反pep 263),那么就坚持使用"plain"coding ,不带前缀。如果我没有弄错的话,源文件编码的最初建议是对前两行使用正则表达式,这两行都允许。
我认为regex是沿着
coding: 的线,后面跟着一些东西。我发现了这个:http://www.python.org/dev/peps/pep-0263/这是最初的建议,但我似乎找不到最终的规格说明他们做了什么。
我确实用过
encoding: 来达到很好的效果,所以很明显这是可行的。试着换个完全不同的东西,比如
duhcoding: ... ,看看是否也能奏效。我怀疑它类似于Ruby——任何一种方法都可以。
这主要是因为不同的文本编辑器使用不同的标记编码方法(即这两种方法)。
对于Ruby,只要第一个或第二个(如果有shebang行)包含匹配的字符串:
1coding: encoding-name忽略那些行中的空白和其他绒毛。(通常也可以是a=而不是:,)。