2010-05-25 148 views
1

我取回從數據庫中文編碼的數據,我想將數據發送爲HTML內容的電子郵件時,代碼是這樣的:有關python編碼混亂

html += """<tr><td>"""   
html += unicode(rs[0], 'big5') # rs[0] is data encoded in big5 

我運行該腳本,但所提出的錯誤:UnicodeDecodeError:'ascii'編解碼器無法解碼字節......但是,我嘗試了交互式python命令行中的代碼,沒有提出錯誤,您能否給我提供線索?

+1

「ASCII」編解碼器不能__what__字節解碼? – Propeng 2010-05-25 11:17:23

+1

你的意思是'html + = unicode(rs [0],'big5')' – Amarghosh 2010-05-25 11:17:31

回答

1

您致電unicode()工作正常。它是串聯,它將一個unicode對象添加到字節字符串中,這是造成麻煩的原因。如果您將第一行更改爲u'''<tr><td>'''(或u'<tr><td>'),它應該可以正常工作。

編輯:這意味着你的錯誤之處在於,已經在html的時候蟒蛇的數據到達這個片斷:

>>> '\x9f<tr><td>' + unicode('\xc3\x60', 'big5') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x9f in position 0: ordinal not in range(128) 
>>> u'\x9f<tr><td>' + unicode('\xc3\x60', 'big5') 
u'\x9f<tr><td>\u56a5' 
>>> 
+2

如果可能,您應該始終處理unicode對象。儘可能快地將輸入解碼爲unicode。儘可能晚地將輸出編碼爲特定的編碼(例如,utf-8)。儘可能使用'codecs.open()'而不是內置的'open()'。 – jcdyer 2010-05-25 15:14:46

2

如果html還不是一個unicode對象,而是一個普通的字符串,當它與轉換後的版本rs[0]連接時,它會轉換爲unicode。如果html現在包含特殊字符,則可能會出現unicode錯誤。

因此html的其他內容也需要正確解碼爲unicode。如果特殊字符來自字符串文字,您可以使用unicode文字(如u"abcä")。

+0

那麼我應該用什麼編碼的html,所以html內容在郵件中正確顯示? – 2010-05-25 12:44:14

+0

@zhangzhong:你應該使用HTML編碼的編碼。只有你可以知道是什麼編碼,但是如果它與其他數據相同,它可能是'big5'。 – sth 2010-05-25 21:51:29