it-swarm.com.de

hash-Unicode-String in Python

Ich versuche ein paar Unicode-Strings zu markieren:

hashlib.sha1(s).hexdigest()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-81: 
ordinal not in range(128)

dabei ist s so etwas wie:

∑ ™ £ ¶ ¶ ¶ – – – – ® ® ® ® ® ¥ ¥ ˆ π π © © ©…………………… ≈ у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у у уй „« ««\Dzћ ÷… • «l «cxcvіƒm≤≥ї! @ # $ © ^ & * (()) () –––––––––– ∆∆∆∆∆∆∆∆∆∆∆∆∆ ∆∆∆∆∆∆ •… ÷ ћzdzћ ÷… • ∆љlљ∆ •… ÷ ћz∆љ ÷… • ∆љ∆ •… љ∆ •… љ∆ •… ∆љ •… ∆љ •… љ∆ •… љ∆ •… ∆ • … ∆ •… ∆ • ∆… • ÷ ÷ •… ÷ ∆ •… ÷ ∆ •… ÷ ∆ •… ÷ ∆ •… ÷ ∆ •… ÷ •…

was soll ich reparieren?

44
Halst

Anscheinend erwartet hashlib.sha1 kein unicode-Objekt, sondern eine Folge von Bytes in einem str-Objekt. Wenn Sie Ihre unicode-Zeichenfolge in eine Folge von Bytes codieren (beispielsweise mit der UTF-8-Codierung), sollte dies behoben werden:

>>> import hashlib
>>> s = u'é'
>>> hashlib.sha1(s.encode('utf-8'))
<sha1 HASH object @ 029576A0>

Der Fehler liegt darin, dass versucht wird, das unicode-Objekt automatisch in eine str zu konvertieren, wobei die standardmäßige ascii-Kodierung verwendet wird, die nicht alle Nicht-ASCII-Zeichen verarbeiten kann (da Ihr String kein reines ASCII ist).

Ein guter Ausgangspunkt, um mehr über Unicode und Kodierungen zu lernen, ist der Python docs und dieser Artikel von Joel Spolsky .

84
Cameron

Codierungsformat verwenden utf-8, Versuchen Sie es auf diese einfache Weise,

>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
3
Jay Patel

Sie Hash-Bytes, keine Zeichenfolgen. Sie müssen also wissen, welche Bytes Sie wirklich hashten möchten, ob eine utf8-Speicherdarstellung der Zeichenfolge, eine utf16-Speicherdarstellung der Zeichenfolge usw.

0
Eduardo