哈希方法与Unicode编码错误
在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)
我该怎么解决这个问题呢?
谢谢!
2 个回答
1
这个错误看起来不是出在 __hash__
函数上,而是在 __str__
函数里。
你可以试试在有问题的对象上用 str(yourobject)
,这样你就能明白我说的是什么了。
请修改一下你的问题,添加上你的 __str__
函数(还有相关的数据),这样我们才能告诉你该怎么修正它。
2
问题在于你试图对一个无法转换为ASCII的字符串进行哈希处理。str方法会接收一个unicode对象,并默认将其转换为ASCII。
要解决这个问题,你需要直接对unicode对象进行哈希,或者使用正确的编码方式来转换字符串。
举个例子,如果你是在美国的Windows系统上从控制台读取unicode,可以这样做:
return hash(mystring.encode("cp437"))
另一方面,从注册表或API函数获取的数据可能会被编码成:
return hash(mystring.encode("cp1252"))
请注意,本地系统的编码方式会根据地区设置而有所不同,所以你需要使用locale库来查找具体的编码方式。
我注意到你在转换str(self),这意味着你需要重写__str__
方法来进行编码,可能还需要在受影响的对象中重写__repr__
。
http://boodebr.org/main/python/all-about-python-and-unicode
这是一个很不错的链接,里面有很多关于Python和unicode的有用信息。特别是“为什么print不工作?”这一部分值得一看。