範囲外のすべての文字を削除する良い方法は何ですか: ordinal(128)
Pythonの文字列から?
Python 2.7 で hashlib.sha256 を使用しています。私は例外を取得しています:
UnicodeEncodeError: 'ascii' コーデックは位置 13 の文字 u'\u200e' をエンコードできません: 序数が範囲内にありません(128)
これは、ハッシュしようとしている文字列にファンキーな文字が入っていることを意味すると思います。
ありがとう!
これらの文字を削除する代わりに、hashlib が詰まらないエンコーディング (utf-8 など) を使用することをお勧めします。
>>> data = u'\u200e'
>>> hashlib.sha256(data.encode('utf-8')).hexdigest()
'e76d0bc0e98b2ad56c38eebda51da277a591043c9bc3f5c5e42cd167abc7393e'
これは、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'
>>>
本当の問題は、sha256
python2 が明確な概念を持っていない一連のバイトを取ることです。使用.encode("utf-8")
は私が提案するものです。