在Python 2.5中,我有以下哈希函数:
def __hash__(self):
return hash(str(self))
它适合我的需求,但现在我开始收到以下错误消息。知道发生了什么事吗?
return hash(str(self))
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 16: ordinal not in range(128)
我该如何解决这个问题?
谢谢!
答案 0 :(得分:2)
问题是您正在尝试散列不可转换为ASCII的字符串。 str方法接受一个unicode对象,默认情况下将其转换为ASCII。
要解决此问题,您需要直接散列unicode对象,否则使用正确的编解码器转换字符串。
例如,如果从美国Windows本地化系统的控制台读取unicode,则可以执行此操作:
return hash(mystring.encode("cp437"))
另一方面,来自注册表或API函数的数据可能编码为:
return hash(mystring.encode("cp1252"))
请注意,本地系统的编码因本地化而异,因此您需要了解使用区域设置库的内容。
我注意到你正在转换str(self),这意味着你需要覆盖__str__
方法来在那里进行编码,并且可能在__repr__
中为受影响的对象。
http://boodebr.org/main/python/all-about-python-and-unicode
是一个很好的链接,有很多关于Python和unicode的有用信息。请特别参阅“为什么不打印工作?”一节。
答案 1 :(得分:1)
错误似乎不在__hash__
函数中,而是在__str__
函数中。
在遇到问题的对象中尝试str(yourobject)
,您就会明白我的意思。
请修改问题并添加__str__
功能(及相关数据),以便我们为您指出如何纠正。