记录一下python2.7中文数组传入json的问题

标签: python2.7 编码


python中遇到的至少三分之一的问题,都是编码问题,而且这种问题呀,看起来是小问题,好像只剩这一个bug,整个项目就成功了,但是这一个bug就是要搞到你吐血。

这里记录一下我的问题吧。

我的需求是先用python得到一个中文列表,然后传给前端json用于显示一个图表。

先用python得到一个包含一堆中文名的列表,例如:

xiaoxiurong = ['肖秀荣','肖老师','肖大大','肖四','肖八','肖4','肖8']

直接print xiaoxiurong,立马报错:

SyntaxError: Non-ASCII character '\xe6' in file F:/Python study/xxxxx.py on line 29, but no encoding declared;

这个是python2.7特有的一个问题,按照网上的经验,在文件第一行加上:

# -*- coding: utf-8 -*

即可,再次打印,结果:

['\xe8\x82\x96\xe7\xa7\x80\xe8\x8d\xa3', '\xe8\x82\x96\xe8\x80\x81\xe5\xb8\x88', '\xe8\x82\x96\xe5\xa4\xa7\xe5\xa4\xa7', '\xe8\x82\x96\xe5\x9b\x9b', '\xe8\x82\x96\xe5\x85\xab', '\xe8\x82\x964', '\xe8\x82\x968']

打印出来了,但是乱七八糟的,不过似乎不是乱码,因为如果我用循环遍历出每一个元素的时候:

for each in xiaoxiurong:
    pring each

结果显示的是正常的中文:

肖秀荣
肖老师
肖大大
肖四
肖八
肖4
肖8

但是,这不是我想要的结果,因为接下来我需要把xiaoxiurong这个列表转化为字符串,然后传给json,这样的话传给json的就是一串符号了,不是汉字,可以看看:

print str(xiaoxiurong)

结果:

['\xe8\x82\x96\xe7\xa7\x80\xe8\x8d\xa3', '\xe8\x82\x96\xe8\x80\x81\xe5\xb8\x88', '\xe8\x82\x96\xe5\xa4\xa7\xe5\xa4\xa7', '\xe8\x82\x96\xe5\x9b\x9b', '\xe8\x82\x96\xe5\x85\xab', '\xe8\x82\x964', '\xe8\x82\x968']

注意,上面的不是一个列表,而是一个纯字符串!是“str”。

于是,我又在网上找啊找,找到一个方法:

import json
print json.dumps(xiaoxiurong,ensure_ascii=False)

用json包直接把列表转换成json字符串,同时把编码准换一下。打印结果:

["肖秀荣", "肖老师", "肖大大", "肖四", "肖八", "肖4", "肖8"]

诶!好了!这就是我要的结果嘛!

终于可以了,接下来就是把这个字符串传递给json了。

但是又出现了一个新的问题,传给json后,前端页面显示不出来了!
去页面上查看了一下源代码,发现传过去的json变样了:

["何凯文", "张剑", "商志", "朱伟", "王江涛", "李剑", "唐迟", "刘一男", "陈正康"]

(我传过去的不是xiaoxiurong的那个列表了,换了一个)
问题出来,json似乎把我本来是字符串里面的双引号,全部都转码了!
这可能是一个常见的保护措施吧。

于是又查了查资料,这种问题在SQL语句中也出现的比较多,执行SQL语句的时候,也常常会把我们想放进数据库的一些字符给自动转码了,这个时候一般用数据库的escape_string方法来处理,就是防止自动转码。

这里的话,我是用flask框架在搭建web,因此可以直接使用flask提供的safe过滤器来处理,在我传入前端的数据中,后面加上一个 |safe 即可。如:

data:{{ math_rank[1]|safe }}

这样,数据就可以正常展示了!

终于大功告成!

你可能感兴趣的:(记录一下python2.7中文数组传入json的问题)