Python:UnicodeEncodeError'ascii'编解码器

时间:2014-01-13 09:07:15

标签: python

我只想使用python代码,但这些转换错误我不明白(我总是得到某种类型的' ascii'编码或解码错误)。我疯了,在线路的每个部分进行了解码和编码,它仍然给我带来麻烦。它可以通过GIT https://github.com/TBOpen/papercut获得,如果您愿意更正它(我也解决了类似的错误,未使用self.wfile.write(message.decode('cp1250', 'replace').encode('ascii', 'replace') + "\r\n")在885行检查。

然而,这是我无法解决的问题的追溯(我放弃的地方)。

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)

TIA !!

1 个答案:

答案 0 :(得分:1)

根本问题是responseresult[0]result[1]中的一个实际上是unicode字符串,而不是编码的str字符串。

因此,当您致电(任意挑选一个)response.decode('cp1250', 'replace')时,您要求解码已经解码为Unicode的内容。 Python 2.x对此做的是首先将其编码为您的默认编码(ASCII),以便它可以按您的要求对其进行解码。这就是为什么你试图通过UnicodeEncodeError获得decode。*

要解决这个问题,你必须弄清楚三者中的哪一个是错的,以及为什么。对于包含4个解码调用的语句来说,这是不可能的,但是如果你把它分解成单独的语句,或者只是添加一些print调试来查看这些变量在它们被使用之前的内容是很容易的

然而,它会让您的生活更容易完全重新组织您的代码。而不是在所有地方来回转换所有内容,给自己几十个地方做出一个简单的错误,最终导致程序中途出现无法调试的错误,只需在输入时解码所有输入,将所有内容处理为Unicode ,然后在输出时编码所有内容。

顺便说一句,如果您还没有阅读过Python的Unicode HOWTO和博文The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),请先阅读它们,然后再继续阅读。


*如果您认为这是一种语言的愚蠢设计......那么,这就是Python 3存在的主要原因。在Python 3中,您不能decode一个unicodeencode一个bytes,因此错误会尽早出现,并告诉您到底出了什么问题,而不是让你试图找到你在错误类型上调用错误方法的地方并得到一个没有意义的错误。因此,如果您想使用Python 2而不是3,那么您就不会抱怨Python 2的设计比3更s。