zoukankan      html  css  js  c++  java
  • python json unicode utf-8处理总结

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

    d = {'name': '张三', 'age': '1'}
    print d
    jd = json.dumps(d)
    print jd
    

    输出结果为:

    {'age': '1', 'name': 'xe5xbcxa0xe4xb8x89'}
    {"age": "1", "name": "u5f20u4e09"}
    

    这种情况怎么办呢?
    要将字典中的中文正确的输出,可以将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': 'xe5xbcxa0xe4xb8x89'}
    {"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'u5f20u4e09'}
    

    字典中的字符串都带的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'u5f20u946b'}
    {'age': '1', 'name': u'u5f20u946b'}
    

    视觉明锐的同学可能发现第二个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'u5f20u946b'}
    {'age': '1', 'name': 'xe5xbcxa0xe9x91xab'}
    张三
    

    这次是彻底的将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
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    SQL Server 自动化运维系列
    SQL Server性能调优系列
    大数据时代:深入浅出微软数据挖掘算法系列
    大数据系列(5)——Hadoop集群MYSQL的安装
    大数据系列(4)——Hadoop集群VSFTP和SecureCRT安装配置
    大数据系列(3)——Hadoop集群完全分布式坏境搭建
    大数据系列(2)——Hadoop集群坏境CentOS安装
    大数据系列(1)——Hadoop集群坏境搭建配置
    Hadoop Cluster 安装
    Hadoop日常维护系列——Hadoop添加删除节点
  • 原文地址:https://www.cnblogs.com/uestc2007/p/10983970.html
Copyright © 2011-2022 走看看