2011-06-06 138 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