python json.dumps 中文编码

json.dumps(var,ensure_ascii=False)并不能解决中文乱码的问题

python 2.7版本

# -*- coding: utf-8 -*-
m = {'a' : '你好'}

print m
=>{'a': '\xe4\xbd\xa0\xe5\xa5\xbd'}

print json.dumps(m)
=>{"a": "\u4f60\u597d"}

print json.dumps(m,ensure_ascii=False)
=>{"a": "浣犲ソ"}

print json.dumps(m,ensure_ascii=False).decode('utf8').encode('gb2312')
=>{"a": "你好"}

最近接触python,遇到这个问题,上网查资料,基本上都是说json.dumps(var,ensure_ascii=False)可以解决中文编码问题,然而并没有。

要解决中文编码,需要知道python2.7对字符串是怎么处理的:

  • 由于# -- coding: utf-8 -- 的作用,文件内容以utf-8编码,所以print m
    输出的是utf-8编码后的结果{‘a’: ‘\xe4\xbd\xa0\xe5\xa5\xbd’}

  • json.dumps 序列化时对中文默认使用的ascii编码, print json.dumps(m)输出unicode编码的结果

  • print json.dumps(m,ensure_ascii=False)不使用的ascii编码,以gbk编码
    ‘你好’ 用utf8编码是 %E4%BD%A0%E5%A5%BD 用gbk解码是 浣犲ソ

  • 字符串在Python内部的表示是unicode编码。

  • 因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

  • decode的作用是将其他编码的字符串转换成unicode编码

    decode(’utf-8’)表示将utf-8编码的字符串转换成unicode编码。

  • encode的作用是将unicode编码转换成其他编码的字符串

    encode(‘gb2312’),表示将unicode编码的字符串转换成gb2312编码。

    python3中没有这种问题,所以最简单的方法是引入__future__模块,把新版本的特性导入到当前版本

from __future__ import unicode_literals

print json.dumps(m,ensure_ascii=False)

=>{"a": "你好"}

在写入文件的时候出现了Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误

大神的解决方法:
不使用open打开文件,而使用codecs:

from __future__ import unicode_literals
import codecs
fp = codecs.open('output.txt', 'a+', 'utf-8')
fp.write(json.dumps(m,ensure_ascii=False))
fp.close()
  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
json.dumps() 是一个Python中的函数,用于将Python对象编码JSON字符串。它接受一个Python对象作为参数,并返回一个表示该对象的JSON字符串。 它的主要作用是将Python对象转换成JSON字符串形式,方便在网络传输或存储到文件中。它可以接受多个参数,用于控制JSON字符串的生成方式,例如是否跳过特殊键值、是否确保ASCII字符、是否检查循环引用等等。 示例代码中展示了如何使用json.dumps() 将一个字典对象转换成JSON字符串形式。首先,我们定义了一个包含水果和蔬菜的字典对象data,然后使用json.dumps() 函数将该字典对象转换成JSON字符串,并通过print() 函数进行输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Pythonjson.dumps()函数](https://blog.csdn.net/m0_51623564/article/details/127339600)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【pythonjson.dumps() 与 json.loads() 用法](https://blog.csdn.net/qq_45859826/article/details/124158012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值