python - 按非ascii字符查询

标签 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 字符。

当我进行如下查询时:

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 SpolskyPython 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/

相关文章:

python - 如何为此机器学习模型设置 request.py?

java - 在一个请求中上传 JSON 和二进制文件

python - 如何一起检查一个范围内的两个值?

python - 如何优雅地检查字典是否具有给定的结构?

google-app-engine - 如何让 VMware fusion 中的浏览器访问主机上基于 GAE-SDK 的页面?

python - 查询的获取抛出 : 'str' object has no attribute 'kind'

python - 如何在Appengine中处理UDP数据

python - 为什么 GQL 查询不匹配?

python - 如何在python基类中声明可以在派生中访问的成员变量

python - 如何使第一个索引列为空?