Python SyntaxError: 文件中存在非ASCII字符'\xe2
我刚刚从使用Python 3运行Django应用程序切换到使用Python 2.7。现在我遇到了这个错误:
SyntaxError: Non-ASCII character '\xe2' in file /Users/user/Documents/workspace/testpro/testpro/apps/common/models/vendor.py on line 9, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
这个错误提到的代码其实只是一个注释:
class Vendor(BaseModel):
"""
A company manages owns one of more stores.
"""
name = models.CharField(max_length=255)
def __unicode__(self):
return self.name
为什么会这样呢?
这个是可以正常工作的:
class Vendor(BaseModel):
"""
"""
name = models.CharField(max_length=255)
def __unicode__(self):
return self.name
2 个回答
0
正如Martijn Pieters所提到的,你的文档字符串里包含了一个UTF-8(也就是非ASCII)字符。
我想进一步解释一下,如何正确声明文件的编码方式。根据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]+)
这意味着什么呢(在另一个问题的回答中有很好的总结):
所以,你可以在“编码”部分之前放任何东西,但如果你想完全符合Python文档的推荐,就要坚持使用“coding”(没有前缀)。
因此,对于建议的“魔法注释”,可以是:
# coding=utf8
或者:
#!/usr/bin/python
# -*- coding: utf8 -*-
或者:
#!/usr/bin/python
# vim: set fileencoding=utf8 :
12
你的文档字符串里有一个UTF-8编码的U+200E 从左到右标记:
'\n A company manages owns one of more stores.\xe2\x80\x8e\n '
你可以选择把这个字符删掉(建议用代码编辑器,而不是文字处理软件),或者在文件的最上面加上PEP-263编码注释:
# encoding=utf8
Python 3默认使用UTF-8编码,而Python 2默认使用ASCII编码,除非你加上那个注释。