哈希方法与Unicode编码错误

0 投票
2 回答
701 浏览
提问于 2025-04-15 12:16

在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不工作?”这一部分值得一看。

撰写回答