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': '\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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 个人笔记,方便自己查阅使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik阅读 67,951评论 0 5
  • 字符集和编码简介 在编程中常常可以见到各种字符集和编码,包括ASCII,MBCS,Unicode等字符集。确切的说...
    兰山小亭阅读 9,094评论 0 13
  • 说明:本文是我在readthedocs看到的,觉得很不错所以转载过来,有删改,原文地址点这里。 实用Unicode...
    aurora阅读 1,056评论 0 6
  • 今天戴老师给我们留了三项有趣的作业,第一个是从网上查一查西方人早餐吃什么? 西方人有个说法叫做“早餐吃得...
    45cbff51831c阅读 1,668评论 0 1
  • 十里春风留旧情,一行烟柳枯中青 待得明年春又起,柳叶枝头听弦音
    追忆者阅读 214评论 0 9

友情链接更多精彩内容