金字塔中的Unicode地狱:MySQL - > SQLAlchemy - >金字塔 - > JSON

时间:2011-08-21 15:15:28

标签: python json sqlalchemy pyramid

背景

我与unicode和Python真的很混乱。这似乎是一种常见的焦虑,我尝试过使用其他解决方案,但我无法理解它。

设置

MySQL数据库设置

  • collat​​ion_database: utf8_general_ci
  • character_set_database: utf8

SQLAlchemy Model

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值中的“ - ”(短划线符号)。完整堆栈跟踪here。如果退回的产品没有“ - ”,则一切正常!

试过

在返回json_products变量之前,我尝试使用各种类型进行编码和解码。

1 个答案:

答案 0 :(得分:6)

above comment是正确的,但更具体地说,您可以将'label': prod.name替换为'label': prod.name.decode("cp1252")。您可能也应该对json_prod字典中的所有字符串执行此操作,因为您可能会在应用程序的实际使用中看到cp1252个编码字符。

在这方面,根据这些字符串的来源以及您的应用程序中使用该源的程度,您可能会在应用程序的其他位置遇到此类问题,通常是在您最不期望的时候。为了进一步调查,您可能想要确定这些字符串的来源是什么,以及您是否可以在较低级别执行解码/重新编码以纠正此未来的大多数问题。