【发布时间】:2011-10-31 15:11:39
【问题描述】:
背景
我对 unicode 和 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 值中的“-”(破折号)。完整堆栈跟踪here。如果退回的产品中没有“-”,则一切正常!
试过
在返回 json_products 变量之前,我已经尝试过各种类型的编码、解码。
【问题讨论】:
-
我不知道您正在使用的框架,但在某个地方,破折号(N-dash,
–,而不是-)正在被编码为 cp1252(其中给出字节 0x96)。 JSON 总是处理 unicode,因此它尝试使用 UTF-8 对其进行解码,但失败了。所以在某个地方你需要.decode("cp1252")。
标签: python json sqlalchemy pyramid