此问题在此处已有答案:
"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
。
应该如何声明文件编码?
6条答案
按热度按时间8cdiaqws1#
查看此处的文档:
如果Python脚本第一行或第二行中的注解与正则表达式
coding[=:]\s*([-\w.]+)
匹配,则此注解将作为编码声明处理“此表达式的推荐格式为
它也被GNU Emacs识别,并且
这是布拉姆·穆伦纳的VIM所认可的。”
因此,您可以在“coding”部分之前放置几乎任何内容,但是如果您希望100%兼容python-docs-recommendation,请坚持使用“coding”(不带前缀)。
更具体地说,您需要使用Python * 和您使用的特定编辑软件 *(如果它需要/接受任何东西)所识别的任何东西。例如,GNU Emacs(开箱即用)识别
coding
,但Vim不识别(是的,没有通用协议,它本质上是turf war)。6yjfywim2#
只要复制粘贴下面的语句到你的程序顶部,它将解决字符编码问题
hec6srdp3#
人教版263:
第一行或第二行必须与正则表达式“coding[:=]\s*([-\w.]+)”匹配
因此,“编码:UTF-8**”匹配。
PEP提供了一些示例:
wqnecbli4#
截至今天-2018年6月
PEP 263本身提到了它下面的正则表达式:
要定义源代码编码,必须在源文件的第一行或第二行放置一个魔术注解,例如:
或(使用流行编辑器识别的格式):
或:
更准确地说,第一行或第二行必须与以下正则表达式匹配:
因此,正如其他答案所总结的那样,它将匹配带有任何前缀的
coding
,但如果您希望尽可能符合PEP(即使,据我所知,使用encoding
而不是coding
在任何方面都不违反PEP 263)-坚持使用“普通”coding
,没有前缀。70gysomp5#
如果我没有弄错的话,源文件编码的最初建议是对前几行使用正则表达式,这样就可以实现这两种编码。
我认为正则表达式是
coding:
后面跟着的东西。我发现了这个:http://www.python.org/dev/peps/pep-0263/这是最初的提议,但我似乎找不到最终的规范,说明他们到底做了什么。
我确实使用
encoding:
取得了很好的效果,所以很明显这是有效的。尝试更改为完全不同的内容,如
duhcoding: ...
,看看是否同样有效。bhmjp9jg6#
我怀疑它与Ruby类似--两种方法都可以。
这在很大程度上是因为不同的文本编辑器使用不同的标记编码方法(即这两种方法)。
对于Ruby,只要第一行或第二行(如果有shebang行)包含匹配的字符串:
并忽略那些行中的任何空格和其他错误。(它也经常可以是=而不是:)。