先放学习链接,看了这几篇博客,感觉还是有收获的:
https://www.cnblogs.com/linjiqin/p/3674825.html
https://blog.csdn.net/can0227/article/details/83240705
https://blog.csdn.net/liuchunming033/article/details/52223612
编码解码是怎么一回事,到底是怎么变来变去的?
Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化。
而str形式呢,就是字符串形式,它都是以一定的编码格式存在的。常见的编码格式有utf-8、ASCII、gb2312等等,由此可见,肉眼见到的 str 形式一般是看不出来什么编码的哦。
unicode 感觉就单纯很多了,他就是unicode
所以: 编码就是 unicode -> str,解码就是 str -> unicode,先大体有这么个概念吧。
具体语法是怎么写呢?
不同编码格式的字符串之间相互转换编码格式的话,都要先解码成unicode,再编码成其他编码格式的字符串。 如果直接将 str encode的话他会先按照默认的编码方式解码再编码
如str1是gb2312编码的,将str1转成utf-8编码的字符串,需要这么做: str1.decode(‘gb2312’).encode(‘utf-8’)。
sys.defaultencoding指明了默认的字符串解码方式。即在解码时没有明确指明解码方式的时候使用。比如字符串默认的解码方式为“utf-8”, str1是gb2312 编码的, str2是utf-8编码的,那么对于str1.decode() 和 str2.decode(), str2就能解码成功,但是str1不可以。
练习:
#! /usr/bin/env python # -*- coding: utf-8 -*- s = '中文' # 这里的 s 是utf-8编码的字符串类型 s.encode('gb18030')
上面一段代码第二行就指明了该py文件里面的字符串默认编码格式是utf-8的,所以s这个字符串就是utf-8编码的字符串。
第4句代码将 s 重新编码为 gb18030 的格式,即进行 unicode -> str 的转换。因为s本身就是 str 类型的,因此 Python 会自动的先将 s 解码为 unicode,然后再编码成 gb18030。
而当对s进行解码的时候,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding 是ANSCII,如果 s 不是这个类型就会出错。
⚠️注意:从这里我才意识到 原来第二行声明的:coding:utf-8 和 sys.defaultencoding 并不是一样的呢!!!coding 指的应该是字符串的编码, 而sys那个指的是解码的时候默认给你选择的类型,只有两个一样时才会成功,不一样就 GG 啦!
有两种办法改正:
1. 现将 s 指明解码方式解码后再编码。s.decode('utf-8').encode('gb18030')
2. 改变默认编码方式后再编码,加上 sys.setdefaultencoding('utf-8')后, 再运行 s.encode('gb2312')便可以成功
延伸1:
python2 中字符串的默认编码为 ASCII , python3中字符串的默认编码为 unicode
python2 默认解码为ASCII, python3中默认解码为 utf-8
所以在python3中字符串就是unicode了,直接编码就可以了。至于在终端下为什么不会直接展示字符,而是展示类似于 b'xb9xfexb9xfe', 那就和你的电脑本身的编码有关了。
在终端下输入 locale , 我的电脑显示 LANG="zh_CN.UTF-8" ,说明我的电脑展示就是用的 utf-8 编码,所以不能正常展示 gb2312 的编码
延伸2:
str典型编码类型:gbk,utf8; 表现形式:xc4xe3xbaxc3。
而看到类似于u4f60,就需要明白,这个是中文的unicode编码或者说是unicode表示,未经具体的utf8或gbk编码 。