您的当前位置:首页正文

详解json.dumps中文乱码问题

2024-08-01 来源:知网教育

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

json.dumps在不同版本的Python下会有不同的表现, 注意下面提到的中文乱码问题在Python3版本中不存在。

注:下面的代码再python 2.7版本下测试通过

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

结果

{'a': '\xe4\xbd\xa0\xe5\xa5\xbd'}    
1    print json.dumps(odata)

结果

{"a": "\u4f60\u597d"}    
1    print json.dumps(odata,ensure_ascii=False)

结果

{"a": "浣犲ソ"}    
1    print json.dumps(odata,ensure_ascii=False).decode('utf8').encode('gb2312')

结果

{"a": "你好"}

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

由于# -- coding: utf-8 -- 的作用,文件内容以utf-8编码,所以print odata 

输出的是utf-8编码后的结果{‘a’: ‘\xe4\xbd\xa0\xe5\xa5\xbd’}

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

print json.dumps(odata,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(odata,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()

知网教育还为您提供以下相关内容希望对您有帮助:

求助!,python2处理utf-8编码的中文json.dumps后输出乱码问题,求大神帮 ...

include <stdio.h> int jc(int m){ if(m!=1) return m*jc(m-1);else return 1;} int c(int m,int n){ if(m>=n) return jc(m)/(jc(n)*jc(m-n));} int main(void){ int m,n;scanf("%d%d",&m,&n);printf("%d\n",c(m,n));return 0;} ...

完美解决Pyhon json转yaml,yaml转json中文乱码实现文件存储

1. 使用Python打开文件并写入yaml数据,例如:with open('data.yml', 'w', encoding='utf-8') as f: yaml.dump(your_yaml_data, f)2. 当需要将yaml转json时,使用pyyaml的dumps方法,同样指定编码:json_data = yaml.safe_dump(your_yaml_data, ensure_ascii=False) with open('data...

python json 内有多个json

>>> import json>>> data = {"spam" : "foo", "parrot" : 42}>>> in_json = json.dumps(data) # Encode the data>>> in_json'{"parrot": 42, "spam": "foo"}'>>> json.loads(in_json) # Decode into a Python object{"spam" : "foo", "parrot" : 42} Encode过程,是...

django表单form

在django中实现这个form,首先编辑新建form应用中的forms.py。然后创建对应的处理,这里只针对用户账户名和密码进行输出而已,毕竟不是做一个登录,只是做个简单演示。能跑通,但是,HttpResponse构造的响应中的中文字段有问题,会乱码。后来各种处理,又是给设定utf-8又是json.dumps的,发现都没有用,脑子...

...写入记事本的内容都是乱码如何使写入的数据以utf8或者gb2312的码制写...

程序开头:!/usr/bin/env python# -*- coding:utf8 -*-import urllibimport urllib2import stringimport reimport systype0 = sys.getfilesystemencoding() #解决中文乱码问题 后面做抓取程序的时候全部加上decode和encode。pos1 = text.find(term.decode("utf-8").encode(type0))在输入到txt的...