散列方法和UnicodeEncodeError

时间:2009-06-15 20:48:14

标签: python string unicode hash

在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 个答案:

答案 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__功能(及相关数据),以便我们为您指出如何纠正。