祖先:ASCII
美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码。
ASCII 码一共规定了128个字符的编码,大写的字母A是65。
不够,出现了其他编码
GB2312
中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。
汉字实在太多了,还有繁体、各种字符呀,于是加以扩展,有了GBK(gbk几乎中文都能解);
Unicode
Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
UTF-*
互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一。
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
在计算机内存中,统一使用Unicode编码(内存大),保存到硬盘或者需要传输的时候,转换为UTF-8编码(传输节约)。
所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />
的信息,表示该网页正是用的UTF-8编码。
在python中Unicode类型是作为编码的基础类型
decode的作用是将其他编码的字符串转换成unicode编码 -----编码
encode的作用是将unicode编码转换成其他编码的字符串 -----解码
转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
>>> u = '中文' # 指定字符串类型对象u
>>> str1 = u.encode('gb2312') # 以gb2312编码对u进行编码,获得bytes类型对象
>>> print(str1)
b'\xd6\xd0\xce\xc4'
>>> u1 = str1.decode('gb2312') # 以gb2312编码对字符串str进行解码,获得字符串类型对象
>>> print('u1')
'中文'
>>> str2 = u.encode('gbk') # 以gbk编码对u进行编码,获得bytes类型对象
>>> print(str2)
b'\xd6\xd0\xce\xc4'
>>> str3 = u.encode('utf-8') # 以utf-8编码对u进行编码,获得bytes类型对象
>>> print(str3)
b'\xe4\xb8\xad\xe6\x96\x87'
>>> u2 = str1.decode('utf-8') # 报错,因为str1是gb2312编码的
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
爬虫相关编码:
原因是源网页编码和爬取下来后的编码格式不一致,以unicode作为中间编码
decode中写的就是想抓取的网页的编码,encode即自己想设置的编码
resp = resp.decode('gb2312').encode('utf-8')//解决乱码(先解码再编码)
#如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断
isinstance(s, unicode)#用来判断是否为unicode
resp.text返回的是Unicode型的数据。(根据网页的响应来猜测编码)
resp.content返回的是bytes型也就是二进制的数据,网页二进制响应内容。
resp.encoding = "gbk" #查看编码
如何修改编码方式:response.encoding="gbk" #编码
如何修改编码方式:response.content.decode("utf8") #编码
如果你想取文本,可以通过r.text。如果想取图片,文件,则可以通过r.content(图片下载)。(resp.json()返回的是json格式数据)
参考:https://blog.csdn.net/qq_36278071/article/details/79660196