标签: 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 }}
这样,数据就可以正常展示了!
终于大功告成!