2009-06-15 7 views
0

В Python 2.5, у меня есть следующий хеш-функция:метод Hash и UnicodeEncodeError

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

Проблема в том, что вы пытаетесь хешировать строку, которая не конвертируется в ASCII. Метод str принимает объект unicode и по умолчанию преобразует его в ASCII.

Чтобы устранить эту проблему, вам нужно либо хэшировать объект unicode напрямую, либо преобразовать строку с помощью правильного кодека.

Например, вы могли бы это сделать, если вы читаете Юникода из консоли на США Windows, локализованной системы:

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 и Юникода. См., В частности, раздел «Почему печать не работает?»

1

Ошибка, кажется, не в функции __hash__, а в функции __str__.

Попробуйте str(yourobject) в объекте с проблемой, и вы увидите, что я имею в виду.

Пожалуйста, отредактируйте этот вопрос и добавьте функцию __str__ (и соответствующие данные), чтобы мы могли указать вам, как ее исправить.

Смежные вопросы