【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'\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
【python系统学习16】编码基础知识的更多相关文章
- Redis系统学习 一、基础知识
1.数据库 select 1 select 0 2.命令.关键字和值 redis不仅仅是一种简单的关键字-值型存储,从其核心概念来看,Redsi的5种数据结构中的每一个都至少有一个关键字和一个值.在 ...
- MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
- VIM字符编码基础知识
1 字符编码基础知识 字符编码是计算机技术中最基本和最重要的知识之一.如果缺乏相关知识,请自行恶补之.这里仅做最简要的说明. 1.1 字符编码概述 所谓的字符编码,就是对人类发明的每一个文字进行数字 ...
- Quartz学习笔记:基础知识
Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...
- 如何学习FPGA?FPGA学习必备的基础知识
如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA 基础知识 FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...
- C#学习笔记(基础知识回顾)之值类型和引用类型
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
- Python专题三字符串的基础知识
Python专题三字符串的基础知识 在Python中最重要的数据类型包括字符串.列表.元组和字典等.该篇主要讲述Python的字符串基础知识. 一.字符串基础 字符串指一有序的字符序列集合,用单引号. ...
- python爬虫之Beautiful Soup基础知识+实例
python爬虫之Beautiful Soup基础知识 Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库.它能通过你喜欢的转换器实现惯用的文档导航,查找,修改文档 ...
- C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)
一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...
随机推荐
- C. The Big Race
\(给出数n,a,b\) \(在[1,n]区间内随机选数,选出的数被a,b除后同余的概率\) \(这题的精度问题真的是烦炸了~\) \(设最小公倍数lcm=a*b/gcd(a,b)\) \(所以在区间 ...
- C. p-binary(二进制暴力)
\(设最后的答案为t,那么有\) $$2^+2^+...2^+tp=n$$ \(那我们完全可以枚举这个t,判断n-tp(我们下面记为z)能刚好被t个二进制表示\) \(首先,z如果小于t,那一定无法表 ...
- 基于KepServer实现与S7-1200PLC之间的通信
对于学习上位机开发,有一种通信方式是必须要了解的,那就是OPC是OLE for Process Control的简称,然而随着技术的不断发展,人们开始对它有了新的定义,比如Open Platform ...
- android实现计时器
新建布局文件activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearL ...
- [ACdream 1215 Get Out!]判断点在封闭图形内, SPFA判负环
大致题意:在二维平面上,给一些圆形岛屿的坐标和半径,以及圆形船的位置和半径,问能否划到无穷远的地方去 思路:考虑任意两点,如果a和b之间船不能通过,则连一条边,则问题转化为判断点是否在多边形中.先进行 ...
- 在dynamics 365 中,看字段的描述需要到系统字段设置里面才能看到,这里提供一种sql直接看字段和实体名描述的方法
1.在crm对应的主数据库执行下面存储过程: -- ============================================= -- Author: <Author,,Name& ...
- 【教程】高德地图使用ECharts实现数据可视化
关于百度地图结合ECharts实现数据可视化的资料已经很多了,毕竟是官方提供支持的,这里就不再赘述.今天我们来讲一下让高德地图与ECharts结合来实现数据可视化图表的展示. 一.ECharts 高德 ...
- sql查重去除id最小值
select order_id FROM yzj_store_order t WHERE (t.user_id,t.order_status) IN ( SELECT user_id,order_st ...
- React之Antd table表格渲染按钮问题
问题描述:table表格渲染表格数据时,会自动触发操作列中Button的onClick函数,表格渲染完成后,点击Button按钮,onClick函数不能被触发. // 定义表格表头数据 问题写法: ...
- 使用windows(win7和win10),最好用chocolatey
Win10平台使用PowerShell命令行choco来安装所需开源软件. 步骤如下: 打开Chocolatey 官方网站,The package manager for windows,这很巨硬. ...