2014-01-13 84 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更糟糕。