Eliminar todos los caracteres de una cadena cuyos ordinales estén fuera de rango

¿Cuál es una buena manera de eliminar todos los caracteres que están fuera del rango: ordinal(128) de una cadena en python?

Estoy usando hashlib.sha256 en python 2.7. Estoy recibiendo la excepción:

UnicodeEncodeError: el códec ‘ascii‘ no puede codificar el carácter u ‘\ u200e’ en la posición 13: ordinal no está dentro del rango (128)

Supongo que esto significa que algún personaje funky se abrió camino en la cadena que estoy intentando descifrar.

¡Gracias!

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

Creo que funcionaria

o podrías hacer una lista de comprensión

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

[editar] sin embargo, como otros han dicho, puede ser mejor averiguar cómo tratar con Unicode en general ... a menos que realmente lo necesite codificado como ascii por alguna razón

En lugar de eliminar esos caracteres, sería mejor usar una encoding en la que hashlib no se atragante, por ejemplo, utf-8:

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

Este es un ejemplo de donde los cambios en python3 harán una mejora, o al menos generarán un mensaje de error más claro

Python2

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

El problema real es que sha256 toma una secuencia de bytes de la cual python2 no tiene un concepto claro. Usar .encode("utf-8") es lo que sugeriría.