通过非ascii字符查询

时间:2010-12-25 17:11:56

标签: python google-app-engine

我在Google App Engine平台上使用Python。 假设我在数据存储中有以下代码:

class names(db.Model):
    name = db.StringProperty(multiline=True)

并且有如下名称:

name1 = Beyoncé
name2 = El Súper Clásico

与非ascii charachters。

当我进行如下查询时:

q_1 = names.all().filter('name =', name1)

它不起作用,比较错误。

您知道我该如何解决这个问题? 我尝试将“名称”编码为UTF-8,但它也不起作用。

谢谢, 哥里

1 个答案:

答案 0 :(得分:1)

正确解码输入字符串(来自Web请求参数)并正确编码输出字符串(保存在GAE数据存储中)时,完全匹配应该没有问题。

我在GAE SDK交互式控制台中尝试了这个代码段,它可以运行:

from google.appengine.ext import db

class names(db.Model):
    name = db.StringProperty(multiline=True)

some_name = 'Beyonc\xc3\xa9'.decode('utf-8')
    # same as: some_name = u'Beyoncé'
    # same as: some_name = u'Beyonc\u00e9'

n = names(name=some_name)
n.put()

q = names.all().filter('name =', some_name)
print q.get().name.encode('utf-8')
    # prints Beyoncé

您应该调试要比较的字符串的原始值,即存储中保存的字符串和传递给查询的字符串。

如果您不熟悉处理Unicode字符串,我建议您阅读此article about Unicode by Joel SpolskyPython Unicode HOWTO

除此之外,如果您在输入u'é'时运行的搜索查询应匹配'e'等Unicode字符,请考虑比较规范化字符串:

some_name = u'El S\u00faper Cl\u00e1sico' # El Súper Clásico
normalized_name = unicodedata.normalize('NFKD', some_name).encode('ascii', 'ignore') # El Super Clasico