4

範囲外のすべての文字を削除する良い方法は何ですか: ordinal(128)Pythonの文字列から?

Python 2.7 で hashlib.sha256 を使用しています。私は例外を取得しています:

UnicodeEncodeError: 'ascii' コーデックは位置 13 の文字 u'\u200e' をエンコードできません: 序数が範囲内にありません(128)

これは、ハッシュしようとしている文字列にファンキーな文字が入っていることを意味すると思います。

ありがとう!

4

3 に答える 3

4

これらの文字を削除する代わりに、hashlib が詰まらないエンコーディング (utf-8 など) を使用することをお勧めします。

>>> data = u'\u200e'
>>> hashlib.sha256(data.encode('utf-8')).hexdigest()
'e76d0bc0e98b2ad56c38eebda51da277a591043c9bc3f5c5e42cd167abc7393e'
于 2012-06-06T23:08:05.793 に答える
2

これは、python3 の変更によって改善されるか、少なくともより明確なエラー メッセージが生成される例です。

Python2

>>> import hashlib
>>> funky_string=u"You owe me £100"
>>> hashlib.sha256(funky_string)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 11: ordinal not in range(128)
>>> hashlib.sha256(funky_string.encode("utf-8")).hexdigest()
'81ebd729153b49aea50f4f510972441b350a802fea19d67da4792b025ab6e68e'
>>> 

Python3

>>> import hashlib
>>> funky_string="You owe me £100"
>>> hashlib.sha256(funky_string)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing
>>> hashlib.sha256(funky_string.encode("utf-8")).hexdigest()
'81ebd729153b49aea50f4f510972441b350a802fea19d67da4792b025ab6e68e'
>>> 

本当の問題は、sha256python2 が明確な概念を持っていない一連のバイトを取ることです。使用.encode("utf-8")は私が提案するものです。

于 2012-06-06T23:04:15.547 に答える