我正在用GAE中的Go運行時編寫webapp。GAE Datastore Viewer中的utf8錯誤(Go運行時)
我正在保存一個包含字符串的結構,該字符串是使用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
」。這在本地開發數據存儲查看器中不會發生,只有在現場製作中才會發生。
所以我的問題是:hex.EncodeToString()
使用什麼編碼?有沒有辦法指定utf-8輸出?這是一個GAE錯誤,還是確實是一個錯誤的編碼錯誤?
預先感謝您。
我不知道很多有關圍棋的數據存儲API,但在Python中,你必須字節字符串和文本字符串區分通過在你的模型中使用適當的屬性(ByteProperty或TextProperty; StringProperty就像TextProperty,但索引)。我認爲你需要以某種方式將EncodeToString的結果轉換爲[]字節。或者,也許EncodeToString不是你需要的功能? – 2012-01-30 04:47:33
不錯,謝謝,GO API中'[] byte'和'string'確實有區別,我真的不想這樣做,因爲它看起來有點亂,但我會試試它。我幾乎可以肯定,有一個'hex'方法可以直接編碼爲'[] byte',這樣我就可以避免投射,在這種情況下我不是粉絲。 – ArturoVM 2012-01-30 17:28:13
@GuidovanRossum這確實是個問題,我有一個流氓線將'hashedFoo.Sum()'直接轉換爲字符串,而不是通過'hex'編碼 – ArturoVM 2012-01-31 03:53:48