2012-01-29 3 views
0

Я пишу webapp с запуском Go в GAE.Ошибка utf8 в средстве просмотра хранилища данных (Go runtime)

Я сохраняю структуру, содержащую строку, которая является результатом хэширования байтов другой строки с MD5, а затем кодирования байтов хэш-суммы в строку с шестнадцатеричным.

Вот код:

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 Go не знаю, но в Python, вы должны различать между байтовыми строками и текстовыми строками используя соответствующее свойство в вашей модели (ByteProperty или TextProperty; StringProperty похоже на TextProperty, но индексируется). Я думаю, вам нужно каким-то образом привести результат EncodeToString к [] байту. Или, может быть, EncodeToString - это не функция, которая вам нужна? –

+0

Правильно, спасибо, действительно существует различие между '[] byte' и' string' в API Go, я действительно не хотел этого делать, поскольку он кажется немного взломанным, но я все равно попробую. Я почти уверен, что существует метод 'hex' для прямого кодирования' [] byte', и таким образом я мог бы избежать кастинга, из которых я не поклонник в этих случаях. – ArturoVM

+0

@GuidovanRossum это действительно была проблема, у меня была линия изгоев, которая отливала 'hashedFoo.Sum()' непосредственно в строку вместо кодировки через 'hex' – ArturoVM

ответ

1

Проблема была линия изгоев, которая отливала hashedFoo.Sum() непосредственно в строку и назначала ее encodedFoo. Это создало несколько строк с символами, не распознаваемыми utf-8.

hex.EncodeToString() работает нормально.

Я предполагаю, что это урок для себя, чтобы сохранить свой код в чистоте и порядок :)