前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【python系统学习16】编码基础知识

【python系统学习16】编码基础知识

作者头像
xing.org1^
发布2020-05-31 15:10:37
6000
发布2020-05-31 15:10:37
举报
文章被收录于专栏:前端说吧前端说吧前端说吧

编码

计算机是怎么传输和存储数据的?

就是把人类认识的中英文字、其他国家语言、数字甚至运算符等符号转成二进制的0、1,并进行存储和传输。

编码

人类语言:中英文字、其他国家语言、数字甚至运算符等符号

计算机语言:二进制的0、1【没错,计算机只认识0和1】

编码:将人类语言转换为计算机语言。

除了0、1这些阿拉伯数字,像a、b、c这样的52个字母(包括大小写),还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,理论上每个人都可以有自己的一套规则(这就叫编码规则,形成编码表)。

如果使用了不同的编码规则,就会有计算机识别不了的情况,出现乱码

进制

二进制、八进制、十六进制。

八进制和十六进制分别是二进制的3次方和4次方。方便和二进制之间非常直接的相互转换

二进制

由0和1构成的

二进制

十进制

00

0

01

1

10

2

11

3

100

4

101

5

110

6

111

7

1000

8

  • 二进制的00,代表十进制的0
  • 二进制的01,代表十进制的1
  • 二进制的10,代表十进制的2【笑话:世界上有10种人,懂二进制的和不懂二进制的】
  • 二进制的11,代表十进制的3
  • 二进制的100,代表十进制的4
  • 以此类推...
  • 当有两位数时,我们可以表示0到3,共4种状态,即2的平方
  • 当有三位数时,我们可以表示0到7,共8种状态,即2的三次方
  • 当有八位数时,我们可以表示0到255,共256种状态,即2的8次方

八进制

使用0、1、2、3、4、5、6、7组成的

十六进制

使用0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f组成的

ASCII编码表中的“K”

二进制

八进制

十进制

十六进制

字母

01001011

113

75

4B

K

注意这里还是大写的字母K哦~

存储单位

计算机里的存储单位

位/比特(bit)

位:又叫比特(bit)是计算机里最小的存储单位。用来存放一位二进制书,即0或1。

字节(byte)

八个比特是一个字节,是计算机里最常用的单位。简写“B”

千字节(Kilobyte)

兆字节(Megabyte)

简称“兆”

吉字节(Gigabyte)

又叫千兆

单位换算

1B(byte 字节) = 8bit
1KB(Kilobyte 千字节) = 1024B
1MB(Megabyte 兆字节) = 1024KB
1GB(Gigabyte) = 1024MB

为什么办的100兆的宽带,撑死就只有10几兆的下载速度?

因为运营商的带宽是以比特每秒为单位的,比如100M就是100Mbit/s。

而我们常看到的下载速度KB却是以字节每秒为单位显示的,1byte = 8bit,所以运营商说的带宽得先除以8,你的百兆宽带下载速度,也就是十几兆了。

编码表

为了避免乱码,人类就约定了一套共同的编码规则。就像计算机世界的新华字典、牛津英语字典。

编码表历史

ASCII
  • ASCII编码(读音:/ˈæski/),美国首先出台。统一规定了常用符号用哪些二进制数来表示。 因为英文字母、数字再加上其他常用符号,也就100来个,因此使用7个比特位(最多表示128位)就够用了,所以一个字节中被剩下的那个比特位就被默认为0。
  • 但欧洲不光有英语,还有法语字母上的注音符。于是欧洲用了美国剩下的那个比特位,普遍使用一个全字节(8个比特位)进行编码,最多可表示256位,至此,一个字节就用满了!

ASCII统一了前面0-127位,但从状态128到255这一段的解释就完全乱套了,比如135在法语,希伯来语,俄语编码中完全是不同的符号。

GB2312和GBK
  • 中国10万汉字,256位也不够用。于是一张新编码表GB2312被中国科学家发明了。 用2个字节,也就是16个比特位,来表示绝大部分(65535个)常用汉字。后来,为了能显示更多的中文,又出台了GBK标准。
Unicode

因各个国家的编码表都不同。不同国家间通信又会乱码。

  • 于是Unicode(万国码)来统一。 这套编码表将世界上所有的符号都纳入其中。每个符号都有一个独一无二的编码,现在Unicode可以容纳100多万个符号,所有语言都可以互通,一个网页上也可以显示多国语言。

万国码的缺点是让英文字符被迫占用两个字节,耗费计算机存储空间。(如A:用00010001就行,但是为了顺从统一,需要用两个字节:00000000 00010001)

UTF-8
  • UTF-8(8-bit Unicode Transformation Format)被提出。针对Unicode的可变长度字符编码。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。而当字符在ASCII码的范围时,就用一个字节表示,所以UTF-8还可以兼容ASCII编码。

Unicode与UTF-8这种暧昧的关系一言以蔽之:Unicode是内存编码的规范,而UTF-8是如何保存和传输Unicode的手段。

编码表对比

编码表

适用性

特点

ASCII码

英文大小写,字符,不支持中文

美国人发明,占用空间小,用一个字节就行

GB2312码、GBK码

支持中文

中国人发明,GBK是GB2312的升级,增加了更多原来没有的文字字符

Unicode码

支持国际语言,万国码

适用性强但占用空间大。在ASCII码前面补8个bit位就是Unicode码

UTF-8码

支持国际语言

Unicode的升级,两者容易互相转化。占用空间小、适用性强。ASCII码被UTF-8码包含。

编码方案使用情况表

编码表

当前使用情况

备注

ASCII码

-

-

GB2312码、GBK码

中文的文件和中文网站,使用GBK、GB2312

-

Unicode码

计算机内存中处理数据时使用的统一标准格式

Python3中,程序处理我们输入的字符串使用Unicode编码

UTF-8码

数据在硬盘上存储,或者网络上传输时,用的UTF-8

因为节省空间。程序来转换编码。

基于上表,有时候面对不同编码的数据,我们还需要手动操作实现编码转换。就要用到encode(编码)decode(解码)

编码操作和解码操作

编码:encode()

语法:

'你想编码的内容'.encode('你使用的编码表名称')

用法:

print('一天打鱼两个月晒网的小石头'.encode('utf-8'))
# b'\xe4\xb8\x80\xe5\xa4\xa9\xe6\x89\x93\xe9\xb1\xbc\xe4\xb8\xa4\xe4\xb8\xaa\xe6\x9c\x88\xe6\x99\x92\xe7\xbd\x91\xe7\x9a\x84\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'
print('I Love U'.encode('gbk'))
# b'I Love U'
print('小石头'.encode('utf-8'))
# b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'

将上述人类语言编码得到机器语言后的打印结果在注释里。

字母b

这里之所以有个字母b,代表他是bytes(字节)类型的数据。 可以用type()函数验证一下:

print(type(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4')) # <class 'bytes'>
符号\x

另外,几乎每个字母/数字前边都有的\x,他的作用是分隔符,用来分隔一个字节和另一个字节。

这样的分隔符,我们还见过:

<a href="https://www.baidu.com/s?wd=%e5%b0%8f%e7%9f%b3%e5%a4%b4" />

对比发现下边两段字符串,你有发现什么奥妙么!:

%e5%b0%8f%e7%9f%b3%e5%a4%b4
\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4

%\x一样,都是一种分隔符。只不过%是url中的、\x是python中的

解码:decode()

语法:

'你想解码的内容'.encode('你使用的编码表名称')

用法:

print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('UTF-8')) # 小石头

::: warning 注意 你要解码的内容得跟编码时用的编码表一致。不然会报错。 :::

也就是说,UTF-8编码的字节就一定要用UTF-8的规则解码,其他编码同理,否则就会出现乱码或者报错的情况,

print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('GBK'))
# 把utf-8编码的字符串用GBK来解码,就报错了。
# UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position 8: incomplete multibyte sequence
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编码
    • 编码
      • 进制
        • 二进制
        • 八进制
        • 十六进制
        • ASCII编码表中的“K”
      • 存储单位
        • 位/比特(bit)
        • 字节(byte)
        • 千字节(Kilobyte)
        • 兆字节(Megabyte)
        • 吉字节(Gigabyte)
        • 单位换算
      • 编码表
        • 编码表历史
        • 编码表对比
        • 编码方案使用情况表
      • 编码操作和解码操作
        • 编码:encode()
        • 解码:decode()
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档