从字符串谁的序数超出范围删除所有字符(Remove all characters from a st

2019-06-25 06:10发布

什么是去除超出范围的所有字符的好方法: ordinal(128)在Python中的字符串?

我使用的python 2.7 hashlib.sha256。 我发现了异常:

UnicodeEncodeError:在位置13“ASCII”编解码器无法编码的字符的u“\ u200e”:序数不在范围内(128)

我认为,这意味着一些时髦的人物找到了进入我试图散列的字符串。

谢谢!

Answer 1:

new_safe_str = some_string.encode('ascii','ignore') 

我想会的工作

或者你可以做一个列表理解

"".join([ch for ch in orig_string if ord(ch)<= 128])

[编辑]然而,正如其他人说,这可能是更好的弄清楚如何处理与一般的unicode ...除非你真的需要它编码为ASCII出于某种原因



Answer 2:

而不是删除这些字符,这将是更好地使用hashlib不会呛编码,UTF-8,例如:

>>> data = u'\u200e'
>>> hashlib.sha256(data.encode('utf-8')).hexdigest()
'e76d0bc0e98b2ad56c38eebda51da277a591043c9bc3f5c5e42cd167abc7393e'


Answer 3:

这是其中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")就是我建议。



文章来源: Remove all characters from a string who's ordinals are out of range