快捷搜索:  汽车  科技

python字符串操作等技巧汇总(Python讲讲json.dumps和编码)

python字符串操作等技巧汇总(Python讲讲json.dumps和编码)这是一个细节问题,只要发现了,解决还是很容易的:那么,如何解决这个问题呢:{"name": "\u4e2d\u56fd"}很显然“\u”表示该字符串是unicode字符的意思,对这样一段字符串,我们在后面也是可以通过json.loads加载到程序中的:In [24]: astr = '{"name": "\u4e2d\u56fd"}'

python字符串操作等技巧汇总(Python讲讲json.dumps和编码)(1)

南京汤山温泉

预计阅读时间:5分钟

json模块是我们很常用的一个内置模块,通常我们使用它进行Python object和string的一个转换。

曾经注意到一个小细节,我们产品代码有时候会把这样的数据写到数据库中:

{"name": "\u4e2d\u56fd"}

很显然“\u”表示该字符串是unicode字符的意思,对这样一段字符串,我们在后面也是可以通过json.loads加载到程序中的:

In [24]: astr = '{"name": "\u4e2d\u56fd"}' In [25]: json.loads(astr) Out[25]: {'name': '中国'}

通常来说,我们发送到网络中,保存在数据库,或者写到文件里面的都是utf8编码的字符串,比如字符串“中国”,写在文件中就是:

(3_djgo) ➜ /tmp hexdump -C /tmp/test 00000000 7b 22 6e 61 6d 65 22 3a 20 22 e4 b8 ad e5 9b bd |{"name": "......| 00000010 22 7d |"}| 00000012 (3_djgo) ➜ /tmp cat /tmp/test {"name": "中国"}

而不是本文开头的存储形式,以统一的utf8编码保存,有几点好处:

  • 通用:产品的各个部分,不论是数据库,文件对象,前后台传输的数据,都使用utf8编码
  • 紧凑:使用utf8编码保存或者传输明显比传输"\u4e2d\u56fd"更加紧凑

那么,如何解决这个问题呢:

这是一个细节问题,只要发现了,解决还是很容易的:

In [44]: data = {'name': '中国'} In [45]: sdata = json.dumps(data ensure_ascii=False) In [46]: sdata = sdata.encode('utf8') In [47]: fp = open('/tmp/test' 'wb ') In [48]: fp.write(sdata) Out[48]: 18 In [49]: fp.close() In [50]: sdata Out[50]: b'{"name": "\xe4\xb8\xad\xe5\x9b\xbd"}'

看看结果:

(3_djgo) ➜ /tmp cat /tmp/test {"name": "中国"} (3_djgo) ➜ /tmp hexdump -C /tmp/test 00000000 7b 22 6e 61 6d 65 22 3a 20 22 e4 b8 ad e5 9b bd |{"name": "......| 00000010 22 7d |"}| 00000012

其中“e4 b8 ad e5 9d bd”就是“中国”utf8编码后表示。

猜您喜欢: