我正在 Google App Engine 平台上使用 Python。 假设我的数据存储中有以下代码:
class names(db.Model):
name = db.StringProperty(multiline=True)
还有这样的名字:
name1 = Beyoncé
name2 = El Súper Clásico
使用非 ASCII 字符。
当我进行如下查询时:
q_1 = names.all().filter('name =', name1)
不行,比较错误。
您知道如何解决这个问题吗? 我尝试将“名称”编码为 UTF-8,但也不起作用。
最佳答案
以 Unicode 正确解码输入字符串(从 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é
您应该调试正在比较的字符串的原始值是什么,即保存在存储中的字符串和传递给查询的字符串。
我建议阅读这篇文章article about Unicode by Joel Spolsky和 Python Unicode HOWTO如果您不熟悉处理 Unicode 字符串。
除此之外,如果您运行的搜索查询在输入为 'e'
时应与 u'é'
等 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
关于python - 按非ascii字符查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4530930/