Python SyntaxError: 文件中存在非ASCII字符'\xe2

9 投票
2 回答
19315 浏览
提问于 2025-04-18 09:07

我刚刚从使用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编码,除非你加上那个注释。

撰写回答