2014-01-13 59 views
0

我只想Python代码工作,但这些转换错误我不明白(我总是会得到某种'ascii'编码或解码错误)。我疯了,做了一个解码和编码的每一部分的线,它仍然给我麻烦。它可以通过GIT在https://github.com/TBOpen/papercut,如果你会这样友善地纠正它(我也解决了一个类似的错误没有检查在线885使用self.wfile.write(message.decode('cp1250', 'replace').encode('ascii', 'replace') + "\r\n")Python:UnicodeEncodeError'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) 

TIA!

+0

你使用的是Python 2.x或Python 3.x? –

+0

@ mig-25foxbat:来自回溯的Python 2.6。 –

+0

你可以粘贴你的py代码吗? –

回答

1

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

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

要解决这个问题,你必须弄清楚三者中哪一个是错误的,以及为什么。这是不可能的,一个声明中有4个解码调用的巨大混乱,但如果将它分解成单独的语句,或者只是添加一些调试,以便在它们被使用之前查看那些变量中的内容,这很容易。

但是,它会让你的生活更容易完全重组你的代码。而不是在所有地方来回转换所有内容,给自己几十个地方做一个简单的错误,最终导致程序中途产生不可调试的错误,只需在输入时解码所有输入,将所有内容处理为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 a unicodeencode a bytes,所以错误会尽早显示,并告诉您到底发生了什么问题,而不是让您尝试追查错误的方法对错误的位置键入并得到一个没有道理的错误。所以如果你想使用Python 2而不是3,那么你就不会抱怨Python 2的设计比3更糟糕。