Ад Юникода в Пирамиде: MySQL -> SQLAlchemy -> Пирамида -> JSON - PullRequest
6 голосов
/ 21 августа 2011

Фон

Я в полном беспорядке с юникодом и Python.Кажется, это общая проблема, и я пытался использовать другие решения, но я просто не могу разобраться с этим.

Настройка

Настройка базы данных MySQL

  • collation_database: utf8_general_ci
  • character_set_database: utf8

Модель SQLAlchemy

class Product(Base):
    id = Column('product_id', Integer, primary_key=True)
    name = Column('product_name', String(64)) #Tried using Unicode() but didn't help

Представление пирамиды

@view_config(renderer='json', route_name='products_search')
def products_search(request):
    json_products = []
    term = "%%%s%%" % request.params['term']

    products = dbsession.query(Product).filter(Product.name.like(term)).all()

    for prod in products:
        json_prod = {'id': prod.id, 'label': prod.name, 'value': prod.name, 'sku': prod.sku, 'price': str(prod.price[0].price)}
        json_products.append(json_prod)

    return json_products

Проблема

Я получаю сообщения об ошибках кодирования от модуля json (который называется средством визуализации для этого маршрута), например:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 37: invalid start byte

виновником является "-" (символ тире) в значении prod.name.Полная трассировка стека здесь .Если в возвращаемых продуктах нет «-», то все работает нормально!

Пробовал

Я пробовал кодирование, декодирование различными типами перед возвратом переменной json_products.

1 Ответ

6 голосов
/ 21 августа 2011

Комментарий выше является правильным, но более конкретно, вы можете заменить 'label': prod.name на 'label': prod.name.decode("cp1252").Вероятно, вам следует также сделать это для всех строк в вашем словаре json_prod, поскольку, скорее всего, вы увидите cp1252 кодированные символы в других местах реального использования вашего приложения.

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

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