消除模板变量中的小u

有小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

附表:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值