【python系统学习16】编码基础知识
【python系统学习16】编码基础知识
编码
计算机是怎么传输和存储数据的?
就是把人类认识的中英文字、其他国家语言、数字甚至运算符等符号转成二进制的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'xe4xb8x80xe5xa4xa9xe6x89x93xe9xb1xbcxe4xb8xa4xe4xb8xaaxe6x9cx88xe6x99x92xe7xbdx91xe7x9ax84xe5xb0x8fxe7x9fxb3xe5xa4xb4'
print('I Love U'.encode('gbk'))
b'I Love U'
print('小石头'.encode('utf-8'))
b'xe5xb0x8fxe7x9fxb3xe5xa4xb4'
将上述人类语言编码得到机器语言后的打印结果在注释里。
字母b
这里之所以有个字母b,代表他是bytes(字节)类型的数据。 可以用type()函数验证一下:
print(type(b'xe5xb0x8fxe7x9fxb3xe5xa4xb4')) #
符号x
另外,几乎每个字母/数字前边都有的x,他的作用是分隔符,用来分隔一个字节和另一个字节。
这样的分隔符,我们还见过:
%e5%b0%8f%e7%9f%b3%e5%a4%b4
xe5xb0x8fxe7x9fxb3xe5xa4xb4
%和x一样,都是一种分隔符。只不过%是url中的、x是python中的
解码:decode()
语法:
'你想解码的内容'.encode('你使用的编码表名称')
用法:
print(b'xe5xb0x8fxe7x9fxb3xe5xa4xb4'.decode('UTF-8')) # 小石头
::: warning 注意 你要解码的内容得跟编码时用的编码表一致。不然会报错。 :::
也就是说,UTF-8编码的字节就一定要用UTF-8的规则解码,其他编码同理,否则就会出现乱码或者报错的情况,
print(b'xe5xb0x8fxe7x9fxb3xe5xa4xb4'.decode('GBK'))
把utf-8编码的字符串用GBK来解码,就报错了。
UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position 8: incomplete multibyte sequence
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
WordPress安全漏洞:从任意文件删除到任意代码执行
WordPress安全漏洞:从任意文件删除到任意代码执行 WordPress是网络上最受欢迎的CMS系统。据w3tech统计,约有30%的网站运行了该系统。该系统的应用是如此广泛,难免会成为网络犯罪分子攻击目标。在这篇博文中,我们将为读者介绍WordPress内核中的一个任意文件删除漏洞,这个漏洞可能会导致攻击者执行任意代码。早在7个月前,我们就向WordPress安全团队报告了这个漏洞,但到目前为止,该漏洞仍然没有得到修补。自初次报告(该报告既没有提供任何补丁,也没有给出具体的修复计划)至今,已经过了漫长的时间,但是仍然没有看到任何的修复迹象,所以,我们决定将这个漏洞公之于众,以督促其尽快采取行动。 受影响的版本 在撰写本文时,该漏洞仍然没有补丁可用。并且,所有WordPress版本,包括当前的4.9.6版本在内,都面临这个漏洞的威胁。 要想利用下面讨论的这个漏洞,攻击者需要事先获得编辑和删除媒体文件的权限。因此,该漏洞可用于通过接管角色与作者一样低的帐户或通过利用其他漏洞/错误配置来实现提权。 漏洞危害 利用这个漏洞,攻击者能够删除WordPress安装的任何文件(+ PHP服务器...
- 下一篇
C# 根据BackgroundWorker异步模型和ProgressBar控件,自定义进度条控件
C# 根据BackgroundWorker异步模型和ProgressBar控件,自定义进度条控件 前言程序开发过程中,难免会有的业务逻辑,或者算法之类产生让人能够感知的耗时操作,例如循环中对复杂逻辑处理;获取数据库百万乃至千万级数据;http请求的时候等......用户在使用UI操作并不知道程序的内部处理,从而误操作导致程序无响应,关闭程序等待影响体验的情况,因此,在等待过程中提供友好的等待提示是有必要的,接下来我们一起封装一个自定义进度条控件! 主要使用技术(C#相关)BackgroundWoker异步模型ProgressBar控件泛型定时器System.Timers.Timer自定义控件开发项目解决方案 BackgroundworkerEx : 自定义进度条控件工程Test : 调用BackgroundworkerEx的工程(只是展示如何调用)处理控件样式 新建一个ProgressbarEx名称的用户控件添加Labal控件(lblTips),用于展示进度条显示的信息状态添加一个PictureBox控件(PicStop),充当关闭按钮,用于获取用户点击事件,触发关闭/终止进度条添加进...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Hadoop3单机部署,实现最简伪集群