我正在写一些python代码,我收到了标题中的错误消息,从搜索这与字符集有关。

这是导致错误的行

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

我不知道什么字符不是在ANSI ASCII集?此外,搜索“\xe2”并不能提供关于该字符显示为什么字符的更多信息。这一行中的哪个字符导致了问题?

我还看到了针对这个问题的一些修复程序,但我不确定该使用哪个。有人能澄清什么是问题(python不解释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

当前回答

我试图解析那个奇怪的窗口引号和尝试几件事后,这里是工作的代码片段。

def convert_freaking_apostrophe(self,string):

   try:
      issuer_rename = string.decode('windows-1252')
   except:
      issuer_rename = string.decode('latin-1')
   issuer_rename = issuer_rename.replace(u'’', u"'")
   issuer_rename = issuer_rename.encode('ascii','ignore')
   try:
      os.rename(directory+"/"+issuer,directory+"/"+issuer_rename)
      print "Successfully renamed "+issuer+" to "+issuer_rename
      return issuer_rename
   except:
      pass

#HANDLING FOR FUNKY APOSTRAPHE
if re.search(r"([\x90-\xff])", issuer):
   issuer = self.convert_freaking_apostrophe(issuer)

其他回答

我有同样的问题,但这是因为我复制和粘贴字符串,因为它是。 后来,当我手动输入字符串,因为它是错误消失。

我犯了个错误,因为是-号。当我用手动输入代替它时,错误就解决了。

复制字符串10 + 3 * 5/(16−4)

手动输入字符串10 + 3 * 5/(16 - 4)

您可以清楚地看到两个连字符之间有一点不同。

我认为这是因为不同的操作系统使用不同的格式,或者可能只是不同的软件。

在.py文件的第一行中添加# coding=utf-8行可以解决这个问题。

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

我在运行下面简单的.py代码时遇到了这个问题:

import sys
print 'version is:', sys.version

DSM的上述代码提供了以下内容:

1 'print \xe2\x80\x98version is\xe2\x80\x99, sys.version'

所以问题是我的文本编辑器使用了SMART QUOTES,就像John Y建议的那样。在更改文本编辑器设置并重新打开/保存文件后,它可以正常工作。

如果您想找出是什么字符导致了这个问题,只需将有问题的变量赋值给一个字符串,并在iPython控制台中打印它。

对我来说

In [1]: array = [[24.9, 50.5]​, [11.2, 51.0]]        # Raises an error

In [2]: string = "[[24.9, 50.5]​, [11.2, 51.0]]"     # Manually paste the above array here

In [3]: string
Out [3]: '[[24.9, 50.5]\xe2\x80\x8b, [11.2, 51.0]]' # Here they are!

这里有很多好的解决方案。

其中没有真正解决的一个挑战是如何从视觉上识别某些难以识别的与其他纯ASCII字符相似的非ASCII字符。例如,破折号看起来几乎完全像连字符,大括号看起来很像直引号,这取决于文本编辑器的字体。

这一行代码应该在Mac或Linux上运行,它将剥离不在ASCII可打印范围内的字符,并并排显示差异:

# assumes Bash shell; for Bourne shell (sh), rearrange as a pipe and
# give '-' as second argument to 'sdiff' instead
sdiff --suppress-common-lines script.py <(tr -cd '\11\12\15\40-\176' <script.py)

字符\11、\12和\15分别是八进制的制表符、换行符和回车符;剩余的范围是可见的ASCII字符。(帽尖)

从这个SO线程中收集到的另一个技巧使用了一个逆字符类,由ASCII可见范围之外的任何内容组成,并突出显示它:

grep --color '[^ -~]' script.py

对于grep的macOS / BSD版本,这也可以很好地工作。