谷歌应用引擎在StringProperty v StringListProperty objs中显示不同的unicode吗?

时间:2010-06-22 07:18:08

标签: python string google-app-engine

我有一个db.StringProperty()mRegion设置为某些韩文文本。我在我的仪表板中看到这个值明显是韩文的,如下所示:

한국:충청남도

但是,当我接受这个字段并将其添加到字符串列表属性(db.StringListProperty())时,我最终会得到这样的结果:

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

当我将此字符串列表属性值输出到客户端时,我在客户端上显示此文本时遇到问题,因此当我存储该值时,它让我怀疑服务器端是否存在错误(正如我所期望的那样)像StringProperty一样可读韩语。

有没有人知道我可能在哪里出错或者第二次显示在字符串列表对象中是否正常而问题可能在我的客户端?

感谢。

更新问题的更多细节: 我的客户是一个iPhone应用程序。基本上,我使用iPhone来使用反向地理编码器api获取用户的gps位置信息。我把它发送到app引擎并保存。这部分似乎有效,因为对于韩国,我看到了韩国人的角色。总之,区域名称是这样获得的:

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上时,它会出现乱码。此外,当我在客户端中使用乱码值并将其返回发送到服务器以查找某个区域时,它会失败,因此这向我建议,不是发送韩文文本,而是发送它repr()字符或其他东西。如果,正如你所说,这只是一个介绍的问题,而不是固有的数据本身,那么也许这与我用来试图显示这些数据的系统字体有关?我原以为我错过了对encode()或decode()的正确调用,但不确定。

1 个答案:

答案 0 :(得分:1)

管理界面很可能以不同的方式显示两者,是的。在后一种情况下,它显然是在做一个repr(s),而在前者它只是打印字符串。

管理界面的界面不会影响代码的工作方式,但是字符串和字符串列表在数据存储区中的存储方式相同,并且会以Unicode字符串的形式返回,供您根据需要进行处理。

我强烈建议您阅读this Joel on Software post about unicode。简而言之,您正在处理两种事物:二进制数据和unicode字符。为了让你感到困惑,Python将它们分别暴露为字符串 - 'unicode strings'和'raw strings',但你只应将前者视为实际的字符串。

数据存储区及其StringListProperty和StringProperty存储并返回Unicode字符串。您的框架也应该为您提供Unicode字符串,并接受Unicode字符串,但是一些设计不良的框架却没有。

您需要做的是检查您在处理文本的任何地方使用Unicode字符串,显式调用.encode()将Unicode字符串转换为原始字符串,并使用.decode()转换原始字符串到unicode字符串,并且返回的响应上的字符编码设置正确,并且您使用相同的编码对字符串进行编码。你如何做到这将取决于你的框架。

一旦你完成了这个,如果你还有问题,我建议你写一些简单的单元测试 - 将数据存储到数据存储区并检索它并操纵它,然后检查它等于你的期望 - 来确定问题是。