Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 金字塔中的Unicode地狱:MySQL->;SQLAlchemy->;金字塔->;JSON 背景_Python_Json_Sqlalchemy_Pyramid - Fatal编程技术网

Python 金字塔中的Unicode地狱:MySQL->;SQLAlchemy->;金字塔->;JSON 背景

Python 金字塔中的Unicode地狱:MySQL->;SQLAlchemy->;金字塔->;JSON 背景,python,json,sqlalchemy,pyramid,Python,Json,Sqlalchemy,Pyramid,我对unicode和Python真是一塌糊涂。这似乎是一种常见的焦虑,我也尝试过使用其他的解决方案,但我就是想不起来 安装程序 MySQL数据库设置 排序规则\u数据库:utf8\u常规\u ci 字符集\u数据库:utf8 SQLAlchemy模型 金字塔视图 问题 我从json模块(称为此路由的渲染器)报告了编码错误,如下所示: 罪魁祸首是prod.name值中的“-”(破折号)。完整堆栈跟踪。如果退回的产品中没有“-”号,那么一切正常 尝试 在返回json_products变量之前,我

我对unicode和Python真是一塌糊涂。这似乎是一种常见的焦虑,我也尝试过使用其他的解决方案,但我就是想不起来

安装程序 MySQL数据库设置
  • 排序规则\u数据库:utf8\u常规\u ci
  • 字符集\u数据库:utf8
SQLAlchemy模型 金字塔视图 问题 我从json模块(称为此路由的渲染器)报告了编码错误,如下所示:

罪魁祸首是prod.name值中的“-”(破折号)。完整堆栈跟踪。如果退回的产品中没有“-”号,那么一切正常

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

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


请注意,根据这些字符串的来源以及该来源在应用程序中的使用范围,您可能会在应用程序的其他地方遇到此类问题,通常是在您最不希望的时候。为了进一步调查,您可能需要找出这些字符串的来源,以及您是否可以在较低的级别上进行解码/重新编码,以纠正未来的大多数问题。

我不知道您正在使用的框架,但大致上是破折号(N-dash,
-
,而不是
-
)正在cp1252中进行编码(给出字节0x96)。JSON总是处理unicode,因此它尝试使用UTF-8对其进行解码,但失败了。所以在某个地方你需要一个
.decode(“cp1252”)
。太棒了!谢谢-这也帮助解决了一些其他编码问题。我不明白为什么当数据库是utf8时它被编码为cp1252。结果表明,MySQL客户端在没有特别说明的情况下默认为latin1。即使表格是utf8。我在数据库连接URL的末尾添加了“?charset=utf8”,这确保了所有返回的数据都编码为UTF-8。现在在较低级别排序,然后!再次感谢!
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
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 37: invalid start byte