[转载] python json unicode utf-8处理总结

参考链接: Python-json 7:Unicode和非ASCII字符编码为JSON

1.直接输出字典中文 在python中经常遇见直接print dict(字典),或者dict转json,但是没有给特定的参数,然后打印json字符串,输出的中文就成了unicode码的情况,如下: 

      d = {'name': '张三', 'age': '1'}

print d jd = json.dumps(d) print jd  

      输出结果为: 

      {'age': '1', 'name': '\xe5\xbc\xa0\xe4\xb8\x89'}

{"age": "1", "name": "\u5f20\u4e09"}  

      这种情况怎么办呢? 要将字典中的中文正确的输出,可以将d转换成json字符串,转换时使用json.dumps(d, ensure_ascii=False, encoding='utf-8')) 

      d = {'name': '张三', 'age': '1'} print d jd = json.dumps(d, ensure_ascii=False, encoding='utf-8')) print jd  

      输出结果为: 

      {'age': '1', 'name': '\xe5\xbc\xa0\xe4\xb8\x89'}

{"age": "1", "name": "张三"}  

      参数ensure_ascii=False不能少, encoding可以省略,因为默认就是encoding='utf-8' 关于参数ensure_ascii的解释: 

          If ``ensure_ascii`` is true (the default), all non-ASCII characters in the output are escaped with ``\uXXXX`` sequences, and the result is a ``str`` instance consisting of ASCII characters only. If ``ensure_ascii`` is ``False``, some chunks written to ``fp`` may be ``unicode`` instances. This usually happens because the input contains unicode strings or the ``encoding`` parameter is used. Unless ``fp.write()`` explicitly understands ``unicode`` (as in ``codecs.getwriter``) this is likely to cause an error.  

      关于参数encoding的解释: 

      ``encoding`` is the character encoding for str instances, default is UTF-8.  

      2.用python自带的json库将json转换成字典输出,输出是unicode码 在用json.loads(json_str)将json_str字符串转换成字典时,字典中的内容是unicode码,具体如下: 

      ud = json.loads(jd, encoding='utf-8')

print ud

 

      输出结果: 

      {u'age': u'1', u'name': u'\u5f20\u4e09'}  

      字典中的字符串都带的u,要想去掉u,有两种办法 a.使用yaml库的yaml.safe_load(jd) 

      import yaml

d = {'name': '张三', 'age': '1'} print d jd = json.dumps(d, ensure_ascii=False, encoding='utf-8')) ud = json.loads(jd, encoding='utf-8') print ud ud = yaml.safe_load(jd, encoding='utf-8') print ud  

      结果输出为: 

      {u'age': u'1', u'name': u'\u5f20\u946b'} {'age': '1', 'name': u'\u5f20\u946b'}  

      视觉明锐的同学可能发现第二个name的值前还是有u,也就是说他是unicode码。的确是的,上面的第1点已经说明了,直接打印字典,字典里面的中文就是乱码的,但是为什么是unicode码,需要更深一步分析,也希望知道的朋友不吝留言告知,谢谢。 

      b 递归实现转码函数自己去将json.loads()返回的字典从unicode码转成自己想要的码,实现如下: 

      def byteify(input, encoding='utf-8'): if isinstance(input, dict): return {byteify(key): byteify(value) for key, value in input.iteritems()} elif isinstance(input, list): return [byteify(element) for element in input] elif isinstance(input, unicode): return input.encode(encoding) else: return input  

      使用示例: 

      d = {'name': '张三', 'age': '1'} print d jd = json.dumps(d, ensure_ascii=False, encoding='utf-8')) ud = json.loads(jd, encoding='utf-8') print ud ud = byteify(ud) print ud print ud['name']  

      输出结果如下: 

      {u'age': u'1', u'name': u'\u5f20\u946b'} {'age': '1', 'name': '\xe5\xbc\xa0\xe9\x91\xab'} 张三  

      这次是彻底的将json.loads()返回的字典转换码成了utf-8,至于输出为什么是乱码?别忘了,开头第一点说的,直接print字典,中文是会乱码的,但是print ud['name'] 就会正常显示中文'张三'。 参考来源:https://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of-unicode-from-json 

      

     

    

   

     

    

   

  

  作者:llicety

  链接:https://www.jianshu.com/p/90ecc5987a18

  来源:简书

  简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

 

转载于:https://www.cnblogs.com/uestc2007/p/10983970.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值