14
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である必要がありますが、これは可能ですか?それが役立つ場合はPython2.7を使用してください...

4

2 に答える 2

21

イグナシオは完璧な答えを出しました。単なる補足: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に変換できません。それはあなたの意図において何かがかなり正しくないという合図です。

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

于 2011-06-06T21:27:21.140 に答える
13

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

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

于 2011-06-06T20:33:00.247 に答える