Python_关于python2的encode(编码)和decode(解码)的使⽤
在使⽤Python2时,我们习惯于在⽂件开头声明编码
# coding: utf-8
不然在⽂件中出现中⽂,运⾏时就会报错SyntaxError: 之类,这是因为python2的⽂件编码默认使⽤的ascii,ascii码是不⽀持中⽂的。
如果在开头声明了编码,⽂件编码就会变为utf-8。
python执⾏过程的编解码
python使⽤的unicode类型作为编码的基础类型,默认情况下,python在执⾏⽂件过程中的编解码为 str-->unicode-->str,当我们在python开头声明utf-8编码后,编解码就变为了  str-->ascii-->str
举个简单例⼦,就可以验证这个现象。
# coding:utf-8
s = "我要学Python"
print(1, s)
从打印结果可以看出,我们没有做任何处理,中⽂在执⾏过程就被处理成了ascii码
encode&decode
在了解了Python执⾏过程的编码转换后,那我们⾃⼰如果转换编码该如何实现呢?这⾥就得使⽤两个内置⽅法 encode编码和decode解码。
例如:
# coding:utf-8
s = "我要学Python"
s.decode("utf-8")  # 解码
上⾯是⽅法的简单运⽤,但是执⾏上⾯代码,第3⾏就会出现编解码过程中常见的⼀个报错
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
简单分析下,明明执⾏的encode⽅法,为什么会抛decode错误呢?这就要从上⾯介绍的python执⾏过程来分析了。
在执⾏encode⽅法编码时,python先要解码,⽽Python解码默认⽤unicode格式,⽽⽂件开头指定的编码格式为ascii,这就导致编码格式与解码格式不⼀致,从⽽产⽣了报错 ascii 不能解码成 unicode。
要解决这个问题,只需要在编码前,⽤utf-8格式解码就可以了
s = "我要学Python"
s.decode("utf-8").encode("utf-8")  # 编码
s.decode("utf-8")  # 解码
中⽂乱码解决⽅法
在了解编解码过程后,我们来解决实际遇到的问题:接⼝响应中⽂乱码!
⽐如:在接⼝测试中,有些响应类似 "\u9875\u9762\u4e0d\u5b58\u5728" 的响应内容,看起来就像乱码
注意看乱码前⾯有个u ,这表⽰使⽤的unicode编码字符。可⽤以下⽅法进⾏解码:
# 直接在 unicode 字符串前加u  ===> 使⽤Python机制⾃动解码
s = u"\u9875\u9762\u4e0d\u5b58\u5728"
print(s)  # 打印:页⾯不存在。因为字符串为unicode编码格式,python在执⾏过程中,默认就是使⽤的unicode解码,编解码类型⼀致,就看到了中⽂打印内容# 使⽤ decode ⽅法解码成中⽂ ===> 主动解码
s = "\u9875\u9762\u4e0d\u5b58\u5728"
print(s.decode("unicode_escape"))
常见问题
格式化带有中⽂的字符串报错
格式拼接的字符串包含中⽂,会抛错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
# coding:utf-8
s = "\u9875\u9762\u4e0d\u5b58\u5728"
# 拼接的字符串不包含中⽂字符===>正常
print("result: %s" % s.decode("unicode_escape"))
python代码转换
# 拼接的字符串包含中⽂字符串===>异常
print("结果: %s" % s.decode("unicode_escape"))
问题分析:
解决⽅法:
统⼀编码格式
# coding:utf-8
s = "\u9875\u9762\u4e0d\u5b58\u5728"
# ⽅法1:将右边变为 ascii 编码
print("结果:%s" % s.decode("unicode_escape").encode("utf-8"))
# ⽅法2:将左边变为 unicode 编码
print(u"结果:%s" % s.decode("unicode_escape"))
带有中⽂的字符串反转后乱码
带有中⽂的字符串使⽤列表反转⽅式后乱码,使⽤decode("utf-8") 解码,报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 0: invalid start byte
# coding:utf-8
s = "qta_baseline_test_勿删"[::-1]
print(s)
print(s.decode("utf-8"))
问题分析:
中⽂被Python解析后,先转换成ascii码
当使⽤列表反转⽅式后,实际把ascii反转
这就导致了反转后的乱码⽆法被decode("utf-8")正常解码
解决⽅法:
因为采⽤的utf-8编码,所以先使⽤utf-8解码,解码后再反转
# coding:utf-8
s = "qta_baseline_test_勿删"[::-1]
print(s)
s = "qta_baseline_test_勿删".decode("utf-8")[::-1]
print(s)
s = s.encode("utf-8")      # 为了后续字符串能正常使⽤,建议在按原编码⽅式编码print(s)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。