PEP 263定义了如何声明Python源代码编码。
通常,Python文件的前两行应该以:
开头#!/usr/bin/python
# -*- coding: <encoding name> -*-
但是我看到很多文件都以:
开头#!/usr/bin/python
# -*- encoding: <encoding name> -*-
=&GT; 编码而不是编码。
那么声明文件编码的正确方法是什么?
是否允许编码,因为使用的正则表达式是懒惰的?或者它只是声明文件编码的另一种形式?
我问的是这个问题,因为PEP没有谈及编码,它只是谈论编码。
答案 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)
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
并忽略这些线条上的任何空白和其他绒毛。 (它通常可以是=而不是:)。