Python:UnicodeEncodeError';ascii';编解码器

Python:UnicodeEncodeError';ascii';编解码器,python,Python,我只是希望python代码能够正常工作,但我不理解这些转换错误(我总是会遇到某种类型的“ascii”编码或解码错误)。我发疯了,对线路的每一部分都进行了解码和编码,但这仍然给我带来麻烦。如果您愿意的话,可以通过GIT at进行更正(我还使用self.wfile.write(message.decode('cp1250','replace')).encode('ascii','replace')+“\r\n”)解决了第885行没有签入的类似错误 然而,这里有一个我无法解决的问题的回溯(我放弃了)

我只是希望python代码能够正常工作,但我不理解这些转换错误(我总是会遇到某种类型的“ascii”编码或解码错误)。我发疯了,对线路的每一部分都进行了解码和编码,但这仍然给我带来麻烦。如果您愿意的话,可以通过GIT at进行更正(我还使用
self.wfile.write(message.decode('cp1250','replace')).encode('ascii','replace')+“\r\n”)解决了第885行没有签入的类似错误

然而,这里有一个我无法解决的问题的回溯(我放弃了)


TIA!!

根本问题是
响应
结果[0]
结果[1]
中的一个实际上是
unicode
字符串,而不是编码的
str
字符串

因此,当您调用(任意选取一个)
response.decode('cp1250','replace')
时,您要求对已解码为Unicode的内容进行解码。Python 2.x所做的是首先将其编码为默认编码(ASCII)因此,它可以根据您的请求对其进行解码。这就是为什么您在尝试调用
decode
时遇到
unicodeincoder错误的原因*

要解决这个问题,您必须找出这三个语句中的哪一个是错误的,以及原因。对于一个包含4个解码调用的语句来说,这是不可能的,但是如果您将其分解为单独的语句,或者只需添加一些
打印
调试,就可以在使用这些变量之前查看其中的内容

然而,完全重新组织代码会让你的生活变得更容易。与其到处来回转换,给自己几十个地方去犯一个简单的错误,最终导致程序中途出现不可调试的错误,不如在输入时解码所有输入,处理每一个错误将其转换为Unicode,然后在输出时对所有内容进行编码

顺便说一句,如果你还没有读过Python和博客文章,那么在进一步阅读之前先去读一下



*如果你认为这是一种愚蠢的语言设计……那么,这就是Python3存在的主要原因。在Python3中,你不能
解码
a
unicode
编码
a
bytes
,因此错误会尽早出现,并准确地告诉你出了什么问题,而不是让你试图找出调用的位置在错误的类型上使用了错误的方法,并得到了一个毫无意义的错误。因此,如果你想使用Python 2而不是3,你就不必抱怨Python 2的设计比3的设计更愚蠢。

你是在使用Python 2.x还是Python 3.x?@mig-25foxbat:Python 2.6,从回溯中。你能粘贴你的py代码吗?这是一个可怕的不可读和不可修复的问题这是一种糟糕的方法。为什么不在输入时解码所有输入,将所有内容(包括
%
-格式设置为Unicode)处理,然后在输出时编码,而不是到处解码和编码?您不需要解码,然后编码字符串模板(带有
%s
占位符的字符串);它已经是ASCII码了。
Traceback (most recent call last):
  File "/usr/local/lib/python2.6/SocketServer.py", line 535, in process_request
    self.finish_request(request, client_address)
  File "/usr/local/lib/python2.6/SocketServer.py", line 320, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/lib/python2.6/SocketServer.py", line 615, in __init__
    self.handle()
  File "./papercut.py", line 221, in handle
    getattr(self, "do_%s" % (command))()
  File "./papercut.py", line 410, in do_ARTICLE
    self.send_response("%s\r\n%s\r\n\r\n%s\r\n.".decode('cp1250', 'replace').encode('ascii', 'replace') % (response.decode('cp1250', 'replace').encode('ascii', 'replace'), result[0].decode('cp1250', 'replace').encode('ascii', 'replace'), result[1].decode('cp1250', 'replace').encode('ascii', 'replace')))
  File "/usr/local/lib/python2.6/encodings/cp1250.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 20: ordinal not in range(128)