gpt4 book ai didi

python - Pyramid 中的 Unicode hell : MySQL -> SQLAlchemy -> Pyramid -> JSON

转载 作者:太空狗 更新时间:2023-10-30 00:00:23 32 4
gpt4 key购买 nike

背景

我对 unicode 和 Python 真是一团糟。这似乎是一个普遍的焦虑,我尝试过使用其他解决方案,但我就是无法解决这个问题。

设置

MySQL 数据库设置

  • collat​​ion_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

Pyramid View

@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 变量之前,我已经尝试使用各种类型进行编码和解码。

最佳答案

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

请注意,根据这些字符串的来源以及该来源在您的应用中的使用范围,您可能会在应用的其他地方遇到此类问题,而且通常是在您最意想不到的时候。要进一步调查,您可能想弄清楚这些字符串的来源是什么,以及您是否可以在较低级别进行解码/重新编码以纠正大多数 future 的问题。

关于python - Pyramid 中的 Unicode hell : MySQL -> SQLAlchemy -> Pyramid -> JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7139116/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com