什么是去除超出范围的所有字符的好方法: ordinal(128)
在Python中的字符串?
我使用的python 2.7 hashlib.sha256。 我发现了异常:
UnicodeEncodeError:在位置13“ASCII”编解码器无法编码的字符的u“\ u200e”:序数不在范围内(128)
我认为,这意味着一些时髦的人物找到了进入我试图散列的字符串。
谢谢!
什么是去除超出范围的所有字符的好方法: ordinal(128)
在Python中的字符串?
我使用的python 2.7 hashlib.sha256。 我发现了异常:
UnicodeEncodeError:在位置13“ASCII”编解码器无法编码的字符的u“\ u200e”:序数不在范围内(128)
我认为,这意味着一些时髦的人物找到了进入我试图散列的字符串。
谢谢!
new_safe_str = some_string.encode('ascii','ignore')
我想会的工作
或者你可以做一个列表理解
"".join([ch for ch in orig_string if ord(ch)<= 128])
[编辑]然而,正如其他人说,这可能是更好的弄清楚如何处理与一般的unicode ...除非你真的需要它编码为ASCII出于某种原因
而不是删除这些字符,这将是更好地使用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")
就是我建议。