2009-06-15 3 views
0

, 나는 다음과 같은 해시 함수가 있습니다해시 방법과 파이썬 2.5에서 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 메서드는 유니 코드 개체를 사용하고 기본적으로이를 ASCII로 변환합니다.

이 문제를 해결하려면 유니 코드 개체를 직접 해시하거나 올바른 코덱을 사용하여 문자열을 변환해야합니다. 당신은 미국의 Windows 지역 시스템에 콘솔에서 유니 코드를 읽고 있다면

예를 들어,이 작업을 수행 할 수 있습니다 반면에

return hash(mystring.encode("cp437")) 

, 레지스트리 또는 API 함수에서 데이터로 인코딩 될 수 있습니다

return hash(mystring.encode("cp1252")) 

는 로컬 시스템에 대한 인코딩이 현지화에 따라 달라집니다 있습니다, 그래서 당신은 그 로케일 라이브러리를 사용되고 있는지 확인해야합니다.

str (자체)을 변환하는 것으로 나타났습니다. 즉, 인코딩을 수행하기 위해 __str__ 메서드를 재정의해야하고, 영향을받는 개체의 경우 __repr__ 일 가능성이 있습니다.

http://boodebr.org/main/python/all-about-python-and-unicode

는 파이썬과 유니 코드에 대한 유용한 정보를 많이 가진 좋은 링크입니다. 특히 "인쇄가 안되는 이유는 무엇입니까?"섹션을 참조하십시오.

1

오류는 __hash__ 함수에있는 것이 아니라 __str__ 함수에있는 것 같습니다.

문제가있는 개체에 str(yourobject)을 시도하면 의미를 알 수 있습니다.

질문을 수정하고 __str__ 기능 (및 관련 데이터)을 추가하여 수정 방법을 알려주십시오.

관련 문제