我与unicode和Python真的很混乱。这似乎是一种常见的焦虑,我尝试过使用其他解决方案,但我无法理解它。
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变量之前,我尝试使用各种类型进行编码和解码。
答案 0 :(得分:6)
above comment是正确的,但更具体地说,您可以将'label': prod.name
替换为'label': prod.name.decode("cp1252")
。您可能也应该对json_prod字典中的所有字符串执行此操作,因为您可能会在应用程序的实际使用中看到cp1252
个编码字符。
在这方面,根据这些字符串的来源以及您的应用程序中使用该源的程度,您可能会在应用程序的其他位置遇到此类问题,通常是在您最不期望的时候。为了进一步调查,您可能想要确定这些字符串的来源是什么,以及您是否可以在较低级别执行解码/重新编码以纠正此未来的大多数问题。