计算机中字符集和及python3编码

祖先: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 的实现方式之一。

字符ASCIIUnicodeUTF-8
A0100000100000000 0100000101000001
x01001110 0010110111100100 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

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值