我在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,但它也不起作用。
谢谢, 哥里
答案 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 Spolsky和Python 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