2011-06-06 108 views
12
import hashlib 
string1 = u'test' 
hashstring = hashlib.md5() 
hashstring.update(string1) 
string2 = hashstring.digest() 

unicode(string2) 

UnicodeDecodeError: 'ascii' codec can't decode byte 0x8f in position 1: ordinal 
not in range(128) 

該字符串必須是unicode,因爲它對我有任何用處,可以這樣做嗎? 使用python 2.7如果有幫助...將hash.digest()轉換爲unicode

回答

11

.digest()的結果是一個字節串1,因此將其轉換爲Unicode是毫無意義的。如果您想要可讀的表示,請使用.hexdigest()

¹某些字節串可以轉換爲Unicode,但由.digest()返回的字節串不包含文本數據。它們可以包含任何字節,包括空字節:如果不使用轉義序列,它們通常不可打印。

+0

這工作,非常感謝。 – 2011-06-06 20:44:44

20

Ignacio剛剛給出了完美的答案。只是一個補充:當您從以ASCII到Unicode沒有找到字符編碼轉換某些字符串,你必須通過編碼作爲參數:

>>> unicode("órgão") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 
>>> unicode("órgão", "UTF-8") 
u'\xf3rg\xe3o' 

如果你不能說什麼是原始編碼(UTF -8在我的例子)你真的不能轉換爲Unicode。這是一個信號,表明你的意圖有些不正確。

最後但並非最不重要的是,編碼是相當混亂的東西。這comprehensive text about them可以讓他們清楚。

+0

unicode(「órgão」,「UTF-8」)爲什麼在我的Python 2.7環境下不起作用? – superche 2012-10-09 04:05:36

+0

@superche也許你在你的終端中使用了另一種編碼。在你的機器上,print repr(「ógão」)的輸出是什麼? – brandizzi 2012-10-09 11:48:11