2012-01-29 2 views
0

GAE의 Go 런타임이 포함 된 webapp을 작성하고 있습니다.GAE 데이터 스토어 뷰어에서 utf8 오류가 발생했습니다 (런타임에 실행)

다른 문자열의 바이트를 MD5로 해싱하고 해시 합계 바이트를 16 진수로 문자열로 인코딩 한 문자열을 포함하는 구조체를 저장합니다. 여기

몇 가지 코드 :

foo := "some string" 
hashedFoo := md5.New() 
hashedFoo.Write([]byte(foo)) 
encodedFoo := hex.EncodeToString(hashedFoo.Sum()) // this is what I'm assigning to my struct, and then saving into the Datastore 

이 잘 작동 데이터 저장소 뷰어를로드 할 때, 저장하거나 (코드를 통해) 저장된 개체를 검색하는 불만은, 그러나, 나는 같은 것을 말한다 오류가 발생하지 "Error fetching entities: Property Foo is corrupt in the datastore"그리고 내부 GAE 파일에 대한 일련의 참조가있는 추적 표시가 있고 그 다음이 "UnicodeDecodeError: 'utf8' codec can't decode byte 0x85 in position 1: unexpected code byte"입니다. 로컬 개발 Datastore Viewer에서는 라이브 프로덕션에서만 사용할 수 있습니다.

제 질문은 무엇입니까? hex.EncodeToString()은 어떤 인코딩을 사용합니까? utf-8 출력을 지정하는 방법이 있습니까? 이것은 GAE 버그입니까, 아니면 실제로 잘못된 인코딩 오류입니까?

미리 감사드립니다.

+0

나는 이동 데이터 저장소 API에 대해 잘 모르겠지만, 파이썬, 당신은 바이트 문자열과 텍스트 문자열을 구분해야한다이이 교훈 추측 (ByteProperty 또는 TextProperty, StringProperty는 TextProperty와 비슷하지만 색인화 된) 모델의 해당 속성을 사용합니다. 당신이 어떻게 든 EncodeToString의 결과를 [] byte로 캐스팅해야한다고 생각합니다. 또는 EncodeToString이 필요한 함수가 아닐 수도 있습니다. –

+0

맞아, 고마워, Go API에서'[] byte'와'string'을 구별 할 수있다. 어쨌든 조금 해킹 된 것처럼 보이기 때문에 정말로하고 싶지는 않았다. 나는'[byte] '로 직접 인코딩하는'hex'메소드가 있다는 것을 거의 확신하고 있으며, 이런 식으로 캐스팅을 피할 수있다. 나는이 경우에 팬이 아니다. – ArturoVM

+0

@GuidovanRossum 이것이 실제로 문제였습니다.'hexhed'를 통해 인코딩하는 대신 문자열에'hashedFoo.Sum()'을 직접 캐스팅하는 불량한 선이있었습니다. – ArturoVM

답변

1

문제는 hashedFoo.Sum()을 문자열로 직접 변환하여 encodedFoo에 할당하는 불량 라인이었습니다. 이로 인해 utf-8이 인식 할 수없는 문자가있는 문자열이 생성되었습니다.

hex.EncodeToString() 잘 작동합니다.

나 자신은 깨끗한 내 코드를 유지하고 깔끔한 :)

관련 문제