web-dev-qa-db-ja.com

hash.digest()をUnicodeに変換します

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)を使用すると、...

13
jbaranski

.digest()の結果はバイト文字列¹であるため、Unicodeに変換しても意味がありません。読みやすい表現が必要な場合は、.hexdigest()を使用してください。

¹一部のバイト文字列はUnicodeに変換できますが、.digest()によって返されるバイト文字列にはテキストデータが含まれていません。これらには、ヌルバイトを含む任意のバイトを含めることができます。通常、エスケープシーケンスを使用しないと印刷できません。

イグナシオは完璧な答えを出しました。単なる補足:ASCIIにない文字を含むエンコーディングからユニコードに文字列を変換する場合、エンコーディングをパラメータとして渡す必要があります:

>>> 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に変換できません。それはあなたの意図において何かがかなり正しくないという合図です。

大事なことを言い忘れましたが、エンコーディングはかなり紛らわしいものです。この それらについての包括的なテキスト はそれらを明確にすることができます。

21
brandizzi