Запрос не-ascii символов - PullRequest
       2

Запрос не-ascii символов

1 голос
/ 25 декабря 2010

Я использую Python на платформе Google App Engine. Допустим, в моем хранилище данных есть следующий код:

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, но это тоже не сработало.

1 Ответ

1 голос
/ 25 декабря 2010

Не должно быть проблем с точными совпадениями при правильном декодировании входных строк (которые вы получаете из параметров веб-запроса) и правильном кодировании выходных строк (которые вы сохраняете в хранилище данных GAE) в Unicode.

I 'мы попробовали этот фрагмент в интерактивной консоли 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é

Вы должны отладить то, что является необработанным значением сравниваемых строк, то есть строки, сохраненной в хранилище, и переданной строки.к запросу.

Я рекомендую прочитать эту статью о Юникоде Джоэла Спольски и Python Unicode HOWTO , если вы не знакомы с обработкой строк Юникода.

В дополнение к этому, если вы выполняете поисковые запросы, которые должны соответствовать символам Unicode, таким как u'é', когда ввод 'e', рассмотрите возможность сравнения нормализованных строк:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...