python3设置编码_[py]python3编码-接口返回乱码

从问题说开去

接口又返回了乱码咋办呢?

看现象, 查原因

$: curl http://127.0.0.1:8000

{"code": "00", "message": "\u6570\u636e\u7c7b\u578b\u9519\u8bef", "data": {}}

贴到浏览器窗口看

20200222214615317993.png

ipython打开贴上去看

In [3]: {"code": "00", "message": "\u6570\u636e\u7c7b\u578b\u9519\u8bef", "data"

...: : {}}

Out[3]: {'code': '00', 'message': '数据类型错误', 'data': {}}

说明浏览器和ipython都可以解码

20200222214615461554.png

20200222214615598278.png

后端怎么给前端准备数据的?

//正常 后端json.dumps返回数据, 设置response的请求头application/json

data = {

"code": "00",

"message": "数据类型错误",

"data": {},

}

josn.dumps(data) # 这种即会造成上面出现的乱码现象.

//后端修复:

josn.dumps(data, ensure_ascii=false)

If ``ensure_ascii`` is false, then the return value can contain non-ASCII

characters if they appear in strings contained in ``obj``. Otherwise, all

such characters are escaped in JSON strings.

因为data中有非ascii,所以确定都是ascii项为false

为什么会乱码?

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。

因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。

为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。

前端返得到那些乱码是什么

\u表示转义, 6570为unicode编码

"\u6570"

python3中b‘\xe4\xb8\xad\xe6\x96\x87‘ 又是什么东西

b'\xe4\xb8\xad\xe6\x96\x87' # 带b的表示bytes类型数据

bytes是一种比特流,它的存在形式是01010001110这种.

如上表示,\x表示转义, 用十六进制展示.

str使用utf8编码成下面的了

>>> s = "中文"

>>> s

'中文'

>>> type(s)

>>> b = bytes(s, encoding='utf-8')

>>> b

b'\xe4\xb8\xad\xe6\x96\x87' #\x 代表是十六进制

>>> type(b)

str使用unicode编码成下面的了

In [15]: bytes(s, encoding='unicode_escape')

Out[15]: b'\\u4e2d\\u6587'

关于unicode如何映射到utf8编码的转换规则, 可以看上面链接.

python3 str和bytes转换

# py3默认用utf8, 解决py2默认用ascii对中文不友好的坑.

>>> import sys

>>> sys.getdefaultencoding()

'utf-8'

>>>

20200222214615787738.png

encode 负责字符到字节的编码转换。默认使用 UTF-8 编码准换。

In [16]: s = "毛台"

In [17]: s.encode()

Out[17]: b'\xe6\xaf\x9b\xe5\x8f\xb0'

In [19]: s.encode("gbk")

Out[19]: b'\xc3\xab\xcc\xa8'

decode 负责字节到字符的解码转换,通用使用 UTF-8 编码格式进行转换。

In [21]: b'\xe6\xaf\x9b\xe5\x8f\xb0'.decode()

Out[21]: '毛台'

n [22]: b'\xc3\xab\xcc\xa8'.decode("gbk")

Out[22]: '毛台'

原文地址:https://www.cnblogs.com/iiiiiher/p/12347213.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值