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

lb3vh1jj  于 2023-03-16  发布在  Python
关注(0)|答案(6)|浏览(113)

此问题在此处已有答案

"SyntaxError: Non-ASCII character ..." or "SyntaxError: Non-UTF-8 code starting with ..." trying to use non-ASCII text in a Python script(7个答案)
5小时前关门了。
PEP 263定义了如何声明Python源代码编码。通常,Python文件的前两行应该以以下内容开头:

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

但我看过很多文件开头都是:

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

也就是说,它写的是encoding,而不是coding
应该如何声明文件编码?

8cdiaqws

8cdiaqws1#

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

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

它也被GNU Emacs识别,并且

# vim:fileencoding=<encoding-name>

这是布拉姆·穆伦纳的VIM所认可的。”
因此,您可以在“coding”部分之前放置几乎任何内容,但是如果您希望100%兼容python-docs-recommendation,请坚持使用“coding”(不带前缀)。
更具体地说,您需要使用Python * 和您使用的特定编辑软件 *(如果它需要/接受任何东西)所识别的任何东西。例如,GNU Emacs(开箱即用)识别coding,但Vim不识别(是的,没有通用协议,它本质上是turf war)。

6yjfywim

6yjfywim2#

只要复制粘贴下面的语句到你的程序顶部,它将解决字符编码问题

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

hec6srdp3#

人教版263:
第一行或第二行必须与正则表达式“coding[:=]\s*([-\w.]+)”匹配
因此,“编码:UTF-8**”匹配。
PEP提供了一些示例:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
# This Python file uses the following encoding: utf-8
import os, sys
wqnecbli

wqnecbli4#

截至今天-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)-坚持使用“普通”coding,没有前缀。

70gysomp

70gysomp5#

如果我没有弄错的话,源文件编码的最初建议是对前几行使用正则表达式,这样就可以实现这两种编码。
我认为正则表达式是coding:后面跟着的东西。
我发现了这个:http://www.python.org/dev/peps/pep-0263/这是最初的提议,但我似乎找不到最终的规范,说明他们到底做了什么。
我确实使用encoding:取得了很好的效果,所以很明显这是有效的。
尝试更改为完全不同的内容,如duhcoding: ...,看看是否同样有效。

bhmjp9jg

bhmjp9jg6#

我怀疑它与Ruby类似--两种方法都可以。
这在很大程度上是因为不同的文本编辑器使用不同的标记编码方法(即这两种方法)。
对于Ruby,只要第一行或第二行(如果有shebang行)包含匹配的字符串:

coding: encoding-name

并忽略那些行中的任何空格和其他错误。(它也经常可以是=而不是:)。

相关问题