Python“SyntaxError:文件中的非ASCII字符'\ xe2'”

213

我正在编写一些Python代码,但是在标题中所述的错误消息中得到了错误提示。从搜索结果来看,这与字符集有关。

这是导致错误的那一行:

hc = HealthCheck("instance_health", interval=15, target808="HTTP:8080/index.html")

我无法确定哪个字符不在ANSI ASCII集合中?而且搜索"\xe2"并没有提供有关显示为什么字符的更多信息。在这一行中,哪个字符引起了问题?

我也看到了一些解决此问题的方法,但我不确定要使用哪种方法。有人能澄清一下这个问题是什么(Python除非被告知如何解释Unicode,否则它不会解释Unicode),以及我应该如何正确地解决它吗?

编辑:以下是所有与出错行相邻的行:

def createLoadBalancer():
    conn = ELBConnection(creds.awsAccessKey, creds.awsSecretKey)
    hc = HealthCheck("instance_health", interval=15, target808="HTTP:8080/index.html")
    lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])
    lb.configure_health_check(hc)
    return lb

75
请在文件顶部添加 # coding: utf-8。 - Mutant
2
你发布的内容没有问题;请查看附近的行。 - kindall
4
你尝试过Mutant的建议了吗?文件中是否有“智能引号”(弯曲和/或倾斜的那种)? - John Y
是的,突变体起作用了,同时使用记事本或其他工具将文件保存为ASCII格式,然后像往常一样使用它。 - KDecker
4
可能导致此问题的一个例子是EN破折号( - \xe2\x80\x93)。 - Martin Thoma
显示剩余3条评论
23个回答

326

如果你只是想使用UTF-8字符或者不在意代码中是否包含它们,可以在你的.py文件顶部加上这一行代码。

# -*- coding: utf-8 -*-

1
对我来说它不起作用。下面总是显示错误。SyntaxError:在文件/home/aslam/projects/deva_26nov/mylibrary/email_constants.py的第393行中有非ASCII字符'\xe2',但没有声明编码;有关详细信息,请参见http://www.python.org/peps/pep-0263.html。 - Aslam Khan
3
为什么这个回答没有被选为最佳答案? - cph
@cph 我是在问题被提出4个月后写的 :) - Chris Redford
@cph 因为虽然这很有帮助,但所选答案回答了“ANSI ASCII集中没有哪个字符”的问题。两个答案都可以接受,但在这种情况下第一个答案通常会获胜。 - Arthur Dent
这个答案对我有用,我认为它是正确的。 - jrp
在我的情况下,我复制了一些 URL 中的零宽字符。https://www.soscisurvey.de/tools/view-chars.php 是一个很好的工具,可以找到它们所有的位置。 - knownasilya

160

你的程序中有一个无法归位的字节。你可以通过运行以下命令找到它:

with open("x.py") as fp:
    for i, line in enumerate(fp):
        if "\xe2" in line:
            print i, repr(line)

你需要将代码文件的名称"x.py"替换为你的程序名称。你将会看到出错的行号和代码行。例如,当我任意插入一个字节后,我的结果是:

4 "\xe2        lb = conn.create_load_balancer('my_lb', ['us-east-1a', 'us-east-1b'],[(80, 8080, 'http'), (443, 8443, 'tcp')])\n"

2
谢谢,这帮了我很多!但我仍不确定图表是/曾经是什么。最终我将代码放入记事本并保存为ASCII格式,然后再粘贴。 - KDecker
我也遇到过这个问题,我认为这是由于复制粘贴问题导致的,其中字符在编辑器(vim)中显示为空格。 - Samveen
10
我也遇到了同样的问题。字符\xe2是连字号“–”(\xe2\x80\x93)的一部分,但比ascii码“-”略长。这是因为我将文本粘贴到vim中时没有注意到这个更长的连字号。详细来说,我在wiki文本中(使用textile)用双连字号“--”生成了这个字符。 - PlasmaBinturong
3
我的名字里有一个撇号,就像“O'Donnell”这样。 - user2490003
2
对于寻找问题字符的人,这个表格很有用。在“UTF-8字节”列中,以“%E2”开头的所有内容都是候选项。通常,问题出现在打开了“智能引号”等“智能”功能的代码编辑器中,将"替换为(U+201C)和(U+201D),或将--转换为(U+2014 em dash)。所有这些在UTF-8中都以“\xe2\x80”开头。 - Schwern
显示剩余4条评论

43

或者你可以简单地使用:

# coding: utf-8

在.py文件的顶部


32

\xe2 是一个'-'字符,在一些复制粘贴操作中,它会被替换成另一个外观相似的'-',导致编码错误。请使用正确的'-'(从您的键盘按键中)替换掉复制粘贴中的'-'。


4
非常感谢!在我的情况下,问题出在“'”这个字符上。 - pietà
0xE2在任何常见编码中都不是连字符。但它是许多常见字符(如非ASCII连字符和引号)的UTF-8编码的一部分。 - tripleee

24

更改文件字符编码,

始终将以下行放置在代码顶部

# -*- coding: utf-8 -*-

12

我在从网页复制和粘贴评论时遇到了相同的错误。

对我来说,问题出在单引号(')上。

我只是将其删除并重新输入即可。


我遇到了同样的错误,但在本地测试时它没有出错并且正常工作。但是当在服务器上运行时,它会出现编码错误。必须将注释中的单引号替换为utf-8版本。 - shivgre

11

在您的.py文件的第一行添加# coding=utf-8行将解决该问题。

请阅读下面链接中有关该问题及其解决方案的更多信息,在本文中,问题及其解决方案被很好地描述:https://www.python.org/dev/peps/pep-0263/


5

我在评论中输入字符时遇到了这个错误(因为我从网上复制/粘贴内容到编辑器中进行笔记记录)。

在 Text Wrangler 中解决方法:

  1. 选中文本
  2. 进入“文本”菜单
  3. 选择“转换为 ASCII”

2
在TextWrangler的后续版本中,选项已更改为text->zap gremlins,但对我有效 :) - TheMethod

4
基于 PEP 0263 -- 定义 Python 源代码编码
Python will default to ASCII as standard encoding if no other
encoding hints are given.

To define a source code encoding, a magic comment must
be placed into the source files either as first or second
line in the file, such as:

      # coding=<encoding name>

or (using formats recognized by popular editors)

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

or

      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> :

尽管它从第一条评论到问题都有效,但答案包含了解释。谢谢。 - WebComer

4

我曾经遇到过同样的问题,只需在文件顶部添加以下内容即可解决(在Python 3中没有这个问题,但在Python 2中有)

#!/usr/local/bin/python
# coding: latin-1

如果你的源文件不是真正的Latin-1,那么情况会变得非常糟糕。你需要找出正确的编码方式,然后将其添加到coding:规范中。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接