有小u表示当前字符串编码为unicode(不是utf-8),一般从数据库里读取出来的数据都会带个小u,最简单的办法就是用utf-8进行一次编码转换(str或encoding('utf-8')都可以)。这种方法在字符串转字符串时是可以的,但是想把字符串(比如json字符串)转换成对象问题就不一样了,首先,json字符串与python对象转换时,字符串的编码是unicode(其他类型的对应关系见附表),即使用json.parse(str(json))或json.parse(json,'utf-8')得到的对象中的字符串仍是带着小u的,这样传递到html中当作模板变量时就有问题了(一般就是提示字母u不识别)。
解决的思路有两个:
1、不用把字符串转换成对象,直接将不带小u的字符串传递到html页面并将其复制到一个js变量上,这样简单直接,但有一点需要注意,如果字符串是key/value形式的字典,而且value也是字典(就是字典套着字典),那得多加一步:先把字符串parse成字符串,然后在dumps成字符串,否则这个字符串value在js是不能转换成对象字典的。
toolscfg_dict = {}
for tc in toolscfg :
toolscfg_dict[tc.toolid] = utils.parse_json(tc.configs)
toolscfg_dict = utils.dumps_json(toolscfg_dict )
return render_to_response("editor/map/prop_show.html", locals(),
context_instance=RequestContext(request))
{% autoescape off %}
var toolscfg_dict = {{toolscfg_dict}};
{% endautoescape %}
2、如果不想借助js变量,那只能先在python中转换完了后直接把这个对象作为模板对象传到html页面。在json.parse()中有object-hook参数,可以作为回调函数来进行转码,这个函数的返回值即为parse()的结果。如果不用这个的话,就自定义一个字符串转换函数,将parse得到的对象属性遍历一遍,把unicode编码的字符串转为utf-8编码的即可。
def unicode2str(dct):
new_dct={}
for key in dct:
value=dct[key]
if isinstance(value,unicode):
value=str(value)
if isinstance(key,unicode):
key=str(key)
new_dct[key]=value
return new_dct
附表: