2010-06-22 79 views
0

我有一個db.StringProperty()mRegion設置爲一些韓國文本。我在儀表板將看到該值是明顯在韓國這樣的:谷歌應用程序引擎顯示unicode在StringProperty v StringListProperty objs?

한국:충청남도

然而,當我把這一領域,並將其添加到字符串列表屬性(db.StringListProperty()),我結束了這樣的事情:

\ ud55c \ uad6d:\ ucda9 \ uccad \ ub0a8 \ ub3c4

我有顯示我的客戶對這個文本的問題時,我有這個字符串列表屬性值輸出到客戶端,所以它使我懷疑在存儲值時服務器端是否有問題(因爲我期望它是可讀的韓文像StringProperty)。

有誰知道我可能會與此如果此第二顯示器會錯誤是在字符串列表對象只是正常,問題可能發生在我的客戶端?

謝謝。

與更新的問題更詳細: 我的客戶是一個iPhone應用程序。基本上,我使用iPhone通過反向地理編碼API獲取用戶的GPS位置信息。我將此發送給應用程序引擎並保存。這部分似乎有用,因爲在韓國,我看到了韓國人物。總之,區域名稱是這樣得到的:

region = self.request.get('region') 
entry.init(region) 
... 
self.mRegion = region 

很簡單(它的工作原理)。

如果它打破了是當我檢索數據併發送回客戶端。總結:

query = db.GqlQuery("SELECT * FROM RegionData WHERE mLatitudeCenter >= :1 and mLatitudeCenter <= :2", latmin, latmax) 
for entry in query: 
     output += entry.mRegion + ',' 
self.response.out.write(output) 

當我藉此,把它放在一個UILabel在客戶端,它的亂碼。此外,當我走在客戶端的亂碼值,並將其發送服務器查找一個區域,它失敗,這樣建議,我認爲不應該發送的韓國文字也許它傳遞的再版()字符或一些東西。如果像你所說的那樣,它只是一個表現問題而不是固有數據本身,那麼也許這與我用來顯示這些數據的系統字體有關?我曾經想過,我錯過了正確的調用encode()或decode()的地方,但不知道。

回答

1

很可能管理界面顯示兩個不同,是的。在後一種情況下,它顯然是在做一個重播,而在前者只是打印字符串。

儘管管理界面的界面並不影響代碼的工作方式 - 字符串和字符串列表在數據存儲區中的存儲方式相同,並且會以Unicode字符串的形式返回,供您根據需要進行處理。

我強烈建議你閱讀this Joel on Software post about unicode。總之,你正在處理兩種東西:二進制數據和unicode字符。爲了混淆你,Python分別將這兩個字符串公開爲字符串 - 「unicode字符串」和「原始字符串」,但是您應該只將前者作爲實際字符串對待。

的數據存儲,其StringListProperty和StringProperty,存儲和返回Unicode字符串。你的框架也應該給你Unicode字符串,並接受Unicode字符串,但是一些設計不佳的框架不會。

你需要做的是檢查你在處理文本的任何地方使用Unicode字符串,你明確地調用.encode()將Unicode字符串轉換爲原始字符串,並使用.decode()將raw字符串轉換爲unicode字符串,並且返回的響應中的字符編碼設置正確,並且您使用相同的編碼對字符串進行編碼。你如何做到這一點將取決於你的框架。如果你仍然遇到問題,我會建議你寫一些簡單的單元測試 - 將數據存儲到數據存儲中,然後檢索並操作它,然後檢查它是否與你期望的一致 - 將其放在哪裏問題是。

+0

謝謝,我添加了更多細節。 – Joey 2010-06-22 14:31:04

+0

更新了我的回覆。 – 2010-06-22 16:22:38

+0

感謝您的澄清和偉大的聯繫。你的第二段確實解決了這篇文章的原始問題,所以這足以讓我考慮它的答案。我最終找到了問題的原因,結果證明我的客戶端以ASCII和UTF-8格式錯誤地編碼了服務器響應。看起來,儘管它在管理界面中可見,但數據存儲中的字符串確實是相同的,並且仍然正確。 – Joey 2010-06-22 17:18:53