首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >金字塔中的Unicode地狱: MySQL -> SQLAlchemy -> -> JSON

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

Stack Overflow用户
提问于 2011-08-21 15:15:28
回答 1查看 2.1K关注 0票数 6

背景

我对unicode和Python的处理非常混乱。这似乎是一种常见的焦虑,我已经尝试过使用其他解决方案,但我就是无法摆脱它。

设置

MySQL数据库设置

  • collation_database: utf8_general_ci
  • character_set_database: utf8

SQLAlchemy模型

代码语言:javascript
运行
复制
class Product(Base):
    id = Column('product_id', Integer, primary_key=True)
    name = Column('product_name', String(64)) #Tried using Unicode() but didn't help

金字塔视图

代码语言:javascript
运行
复制
@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模块(被称为此路由的呈现器)中得到如下所述的编码错误:

代码语言:javascript
运行
复制
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 37: invalid start byte

罪魁祸首是prod.name值中的"-“(破折号)。全堆栈跟踪这里。如果返回的产品没有"-“,那么一切都很好!

试过

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-21 19:37:59

以上评论是正确的,但更特殊的是,您可以用'label': prod.name.decode("cp1252")代替'label': prod.name。您可能还应该对json_prod字典中的所有字符串执行此操作,因为您可能会在实际应用程序的其他地方看到cp1252编码字符。

在这一点上,根据这些字符串的来源以及在应用程序中使用该源的范围,您可能会在应用程序的其他地方遇到这样的问题,通常在您最不期望的情况下也会遇到这样的问题。为了进一步研究,您可能需要弄清楚这些字符串的源是什么,以及是否可以在较低的级别进行解码/重新编码,以纠正大多数未来的问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7139116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档