Pyramid中的Unicode地狱:MySQL -> SQLAlchemy -> Pyramid -> JSON
背景
我在处理unicode和Python时遇到了很大的麻烦。这似乎是个普遍的问题,我尝试过其他一些解决方案,但就是搞不懂。
设置
MySQL数据库设置
- 数据库排序规则: utf8_general_ci
- 数据库字符集: 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
Pyramid视图
@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
上面的评论说得对,但更具体一点,你可以把 'label': prod.name
替换成 'label': prod.name.decode("cp1252")
。你可能还需要对你 json_prod 字典里的所有字符串都这样做,因为在你应用的实际使用中,可能会遇到其他用 cp1252
编码的字符。
说到这,字符串的来源和这个来源在你应用中使用的广泛程度,会影响你在其他地方是否也会遇到类似的问题,通常是在你最不期待的时候。为了进一步调查,你可能需要弄清楚这些字符串的来源,以及是否可以在更低的层级进行解码或重新编码,以解决未来大部分的问题。