2010-06-22 82 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