字符编码的一些概念

1.二进制定义

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

我们发现刚刚我们讲述的狼烟的故事和现在这个新理论出奇相似。假设狼烟点燃用1表示,狼烟灭掉用0表示,那么刚刚我们用狼烟表示百万雄师的理论就可以用在计算机上,这种表示数字的方式就叫做二进制。

你可能会觉得发明计算机的人思路轻奇,为什么要多此一举的用这种方式来表达数字,但事实上计算机不像我们这样智能,CPU是一个包含上百万个精巧的晶体管的芯片集合,晶体管表达感情的方式很简单,就是通过高低电压(有电没电),低电压的时候表示0,高电压的时候表示1,因此最终能让计算机理解的就只有0和1而已。

2.二进制与十进制转换

其实刚刚在无形中我们已经将10进制转换成2进制了,现在我们要再总结一遍。

刚才我们已经发现,二进制的第n位代表的十进制值都刚好遵循着2的n次方这个规律

填位大法:

先把他们代表的值依次写出来,然后再根据10进制的值把数填到相应位置,就好了~~~

十进制转二进制方法相同,只要对照二进制为1的那一位对应的十进制值相加就可以了。
进制转换

3.文字 -> 十进制 ->二进制

通过上一节讲的二进制的知识,大家已经知道计算机只认识二进制,生活中的数字要想让计算机理解就必须转换成二进制。十进制到二进制的转换只能解决计算机理解数字的问题,那么文字要怎么让计算机理解呢?

于是我们就选择了一种曲线救国的方式,既然数字可以转换成十进制,我们只要想办法把文字转换成数字,这样文字不就可以表示成二进制了么?

可是文字应该怎么转换成数字呢?就是强制转换

我们自己强行约定了一个表,把文字和数字对应上,这张表就相当于翻译,我们可以拿着一个数字来对比对应表找到相应的文字,反之亦然。

4.ASCII码

键盘

Ascii表

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A的编码是65,小写字母 z的编码是122。后128个称为扩展ASCII码(为了兼容一字节,在前面扩充一位0)。

4 计算机容量单位bit

alex转换成二进制
转换后的数据

提问:假如我们要打印两个空格一个对勾 写作二进制就应该是 0011111011, 但是问题来了,我们怎么知道从哪儿到哪儿是一个字符呢?

正是由于这些字符串长的长,短的短,写在一起让我们难以分清每一个字符的起止位置,所以聪明的人类就想出了一个解决办法,既然一共就这255个字符,那最长的也不过是11111111八位,不如我们就把所有的二进制都转换成8位的,不足的用0来替换。

这样一来,刚刚的两个空格一个对勾就写作000000000000000011111011,读取的时候只要每次读8个字符就能知道每个字符的二进制值啦。
转换后

在这里,每一位0或者1所占的空间单位为bit(比特),这是计算机中最小的表示单位

每8个bit组成一个字符,这是计算机中最小的存储单位(毕竟你是没有办法存储半个字符的)orz~

要不要举例子说单位?就像我们形容长度会有厘米、分米、米之分,在计算机里也有自己的计量数据大小的单位

人民币的例子:给了你好多钱,假如没有万-十万

bit 位,计算机中最小的表示单位
8bit = 1bytes 字节,最小的存储单位,1bytes缩写为1B
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
1EB=1024PB
1ZB=1024EB
1YB=1024ZB

5.国标:GBK —> GB2312 —> GB18030

显然,对于我们来说能在计算机中显示中文字符是至关重要的,然而刚学习的ASCII表里连一个偏旁部首也没有。所以我们还需要一张关于中文和数字对应的关系表。

之前我们已经看到了,一个字节只能最多表示256个字符,要处理中文显然一个字节是不够的,所以我们需要采用两个字节来表示,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码,共有7445个图形字符,其中汉字占有6763个,采用2个字节编码

而后1955年又发布了GBK1.0,GBK编码能够同时表示繁体字和简体字,该编码标准兼容GB2312,共收录汉字21003个,同时包含中日韩所有文字里面的汉字,依旧采用2个字节编码

2000年发布GB18030,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字,兼容GBK和GB2312字符集。

编码如何使用呢?
在内存中都是Unicode。
而在硬盘文件或者网络传输数据的时候,为了节省空间都是UTF-8

6.Unicode, UTF-8

为了解决每个国家不同编码不互通的问题,ISO标准组织出马了!

Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言,跨平台的文本信息转换,**Unicode(万国码)规定所有字符和符号最少由16位(2字节)表示,即216=65536。

UTF-8(可变长编码),则是对Unicode编码的压缩和优化,他不在最少使用2个字节来限制编码(容易造成浪费),而是将所有字符和符号进行分类:Ascii码中的内容用1个字节保存,欧洲字符用2个字符保存,东亚的字符则用3个字符保存等等
对于汉字,UTF-8是3个字节编码。而GBK是2字节编码,节省空间

6.Python里使用编码

Windows系统中文版默认编码是 GBK
Mac OS\Linux 系统默认编码是 UTF-8
    
Python 2.x默认编码是ASCII码
Python3.x默认编码是UTF-8
所以有时候会乱码,就是因为ASCII编码是不支持汉字的

Python3

Py3

Python2

Py2

通过添加编码格式,规避bug

在这里插入图片描述

规避范例

7. 常用编码一览表

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值