n进制就是每一个位置只能表示0~n-1,到了n之后向前进位,通过一系列连续的位置来表示一个数字
e.g. 十进制的4 – 四进制的10 – 二进制的100
我们在使用计算机时,看到和输入的是十进制,但计算机底层(存储、网络传输)是采用二进制来存储数据的
计算机底层只认识0和1,所以计算机存储、网络传输的并不是我们看到的数据的样子,而是一系列的0和1,这一系列的0和1,一般称之为字节流。
1、编码:将数据转化为字节流,进行存储和网络传输;
2、解码:将字节流转化为数据本身,以供阅读/使用/观看。
要求:将某个字符编码为二进制,之后可以将该二进制在转化为该字符
字符与二进制要有固定、唯一的对应关系
需要一个大家认可的字典/规范,规定这种对应关系
字符集(记录全部的字符)+ 该字符集对应的编解码方式(字符与二进制的对应关系)
GBK字符集:在ASCII字符集的基础上,增加了简体汉字、繁体汉字、数学符号、罗马字母、希腊字母等。
GBK编/解码:GBK字符集中每个字符与二进制字节流的对应关系。
Unicode字符集:为了解决传统的字符编码方案的局限性而产生。包含了每种语言的每个字符,以满足跨语言、跨平台进行文版转换、处理的需求,适应全球化的发展。
UTF-8编/解码:Unicode字符集中每个字符与二进制字节流的对应关系。(还有很多其他的编码方式也采用了Unicode字符集,如 UTF-32、UTF-16等)。
一个str一定能编码成二进制,因为组成str的字符一定在Unicode字符集中。
bytes:字节流/比特流
bytes就是一系列二进制位,也就是说,bytes是0101 0001,但Python中通过十六进制的形式来表示
一段二进制不一定能解码成str。
如果想在Python中直接声明一个bytes对象:
print一个bytes对象:
b’\x十六进制’形式:print(b’\x61’)
b’ascii字符’形式:print(b’\a’)
方法
编码:
解码:
编码
请求网络,拿到Response,Response中包含了二进制字节流/bytes
用软件打开本地的txt文档,也是以某种编解码方式进行的,一般和系统默认的编解码方式有关:可以抛弃原生txt文本编辑器,选用VSCode或nodepad++
{
‘Date’: ‘Thu, 13 Oct 2022 16:17:47 GMT’,
‘Content-Type’: ‘text/html; charset=utf-8’,
‘Transfer-Encoding’: ‘chunked’,
‘Connection’: ‘keep-alive’,
‘Keep-Alive’: ‘timeout=30’,
‘X-Xss-Protection’: ‘1; mode=block’,
‘X-Douban-Mobileapp’: ‘0’,
‘Expires’: ‘Sun, 1 Jan 2006 01:00:00 GMT’,
‘Pragma’: ‘no-cache’,
‘Cache-Control’: ‘must-revalidate, no-cache, private’,
‘X-DAE-App’: ‘movie’,
‘X-DAE-Instance’: ‘default’,
‘Set-Cookie’: ‘bid=tGj9VMzEG8M; Expires=Fri, 13-Oct-23 16:17:47 GMT; Domain=.douban.com; Path=/’,
‘X-DOUBAN-NEWBID’: ‘tGj9VMzEG8M’,
‘Server’: ‘dae’,
‘Strict-Transport-Security’: ‘max-age=15552000’,
‘X-Content-Type-Options’: ‘nosniff’,
‘Content-Encoding’: ‘gzip’
}
i) ‘Content-Type’: ‘text/html; charset=utf-8’
响应体的媒体类型(类型和编码),确定了接收方以什么类型、什么编码读取响应体。
application/x-www-form-urlencoded
multipart/form-data
application/json
text/xml
ii) ‘Content-Encoding’: ‘gzip’
响应体的压缩方式(不同压缩算法),确定了接收方以什么样的方式解压响应体。
gizp
compress
deflate
identity
text = response.text:
将response.content进行解码,requests会根据自己的猜测来判断编码的方式,所以有时候可能会猜测错误,就会导致解码产生乱码。
==> text = response.content.decode(response.encoding):
是response headers响应头 Content-Type 字段 charset 的值;
若response header响应头中没有charset字段,则服务器响应的内容默认为 ISO-8859-1 编码模式,使用此编码方式无法解析中文内容,会造成响应体乱码(解析为乱码数据)
==> text = response.content.decode(apparent_encoding):
自动的从服务器接口响应的内容中(响应体)分析内容编码的方式,所以比 encoding 更加准确
r = requests.get('https://www.baidu.com/')
print(r.text) # 乱码
print(r.content.decode(response.encoding)) # 乱码
print(r.encoding) # ISO-8859-1
print(r.headers('Content-Type')) # 'text/html'
print(r.content.decode(response.apparent_encoding)) # 中文
print(r.apparent_encoding) # utf-8
with open(sourcePath, 'w', encoding='utf-8') as f:
f.write(text)
f.close()
f = open(sourcePath, encoding='utf-8')
content = f.read()
print(content)
f.close()