想必大家在日常的网络生活中,有时会遇到打开一些文件时出现不认识的“外星文”。
你是不是顿时就感觉头大了,反正我看到时是这样的!!!!
然后,是这样的!!!
1. 计算机的编码
我们都知道,计算机只能识别0和1, 但是它是如何将我们输入的内容展示出来的呢?
从输入内容到计算机转变成0与1的代码就是编码,计算机内部有一个编码表进行一一对应。
2. 二进制
究竟什么是二进制呢?
【故事虚构】二进制的由来可追溯至三国时期,在三国中有一个牛人——诸葛亮,下面让我们的牛人诸葛亮来给大家讲讲二进制。
诸葛亮派大将马谡驻守 街亭,诸葛亮叮嘱马谡:若魏军(曹操的军团)来100人,你就点亮1盏“孔明灯”通知我,我想清楚的知道魏国来了多少敌军,我好让人做好准备,才能搞定司马懿那厮。
马谡这人以为自己很聪明,就装起叉来,对诸葛亮说:丞相我懂了,若敌人来了100人,我就放飞1盏孔明灯,若是敌人来了1000人,我就放飞10盏孔明灯;若敌人来10000人,我就放飞100盏孔明灯。。。。。。。。。
诸葛亮听后差点一口老血就上来:你以为孔明灯那么好整?放飞那么多盏孔明灯,你知道需要多少money码?如今天下三分,我都是省吃俭用,你还这么浪费。
马谡的铜铃大眼一转:丞相我懂了,敌人来一个,我就点亮一次,这样的话,就只需要1盏孔明灯了。
这马谡一番深刻的理解,差点没把老诸给送走了,诸葛亮长叹了口气:幼常啊,你想一想,我都快50的人了,又经常熬夜挑灯夜读,近视得厉害,你认为我能够看清多少次,而且你这点来点去,万一出错了呢?
马谡完全像作者遇到了“外星文”一样,问丞相:求答案。
诸葛亮不忘摇摇毛扇冷静冷静:你的学学二进制,多安几盏孔明灯,你把它们放在街亭最高处,但注意,需要以同样得距离排列。
还好马谡一个爱学习得娃:丞相,什么是二进制?
诸葛亮:二进制,乃天人之学也,你只需排列好8盏灯,就可以将敌情准确上报。我就在西城找好位置泡着茶,边喝茶边按照定好得方位观察亮灯得位置,就可以胸有成竹,运筹帷幄了。
马谡又蒙了:丞相,如果来的敌人太多了怎么办?
诸葛亮:二进制,只有0和1,逢二进一,我们品是数数字0,1,2,3,4,5,6,7,8,9,10是十进制,二进制就是你数到2的时候,因为二进制只能使用0和1来表示,2就变成了10。来,你看下面这张对照表,到时候照着这个点灯就行了。
用来存放一个0或者1的位置,就是计算机中最小的储存单位,叫做【位】,外国名字叫【bit】,也叫做【比特】。我们规定8个比特构成一个【字节】(byte),字节是计算机里最常用的单位。
bit是位,byte是字节,1byte = 8bit。没听过位,也没听过字节,我只听过兆M,还有G。这些都是存储单位,它们之间的关系是这样的。
千兆宽带,其实说的是以比特每秒位单位,1000M就是 1000Mbit/s,而我们下载速度是以字节每秒位单位显示的,1byte = 8bit;1000M bit = 125M byte,也就是说千兆宽带,每秒下载速度最多125M。那我们的百兆宽带,下载速度也就只有十几兆了。
3. 编码表
计算机开始发明的时候,用来解决数字计算问题。但是后来发现,只用二进制解决问题还是有限,怎么办呢?
计算机这种东西最早由老外发明,外国人使用的英语只有26个字母,再加上标点、数字和一些符号也不会太多,老外搞出来一个东西叫做ASCII码,这个比二进制高级了一些。ASCII码组合出的256种状态,至此一个字节就使用满了。
后来,计算机来到了中国,就出现大问题了,ASCII码最多表示256种状态,我们汉字千千万万, 256个远远不够啊。我们科学家就重新编写了一张编码表,叫做GB2312(word中有这种编码方式),它使用2个字节16个比特位,来表示绝大多数(65535)个汉字。后来,为了显示更多的汉字,又研究出一套编码,GBK编码。
美国人有ASCII码,中国人有GB2312与GBK编码,那阿拉伯人呢?欧洲人呢?就像下面的乱码一样,这是咋形成的。就是美国人的编码到了我们中国,我们看不懂;中国人的编码到了欧洲,欧洲人看不懂。
为了能够让全世界人民都能畅通的交流。Unicode应运而生。Unicode把所有语言都统一到一套编码里,可以容纳100多万个符号,这样就不会再有乱码问题了。好开森,大家终于可以愉快的玩耍了,但是由于把所有语言都统一到一套编码里中,就造成Unicode码越来越庞大。比如英文A,之前可以用00010001表示,但是到了Unicode码中,必须使用00000000 00010001来表示。
于是,有人觉得太长了。太麻烦了。于是,科学家们又针对Unicode码研究出了一种可变长度字符编码,叫做UTF-8(8-bit Unicode Transformation Format),它可以根据不同的符号来变化字节长度。
4. 编码encode()与解码decode()
-
编码encode就是把人类语言转成计算机语言。
-
解码decode就是把计算机语言转成人类语言。
用法
print('编码'.encode('gbk'))
print('编码'.encode('utf-8'))
print(b'\xb1\xe0\xc2\xeb'.decode('gbk'))
print(b'\xe7\xbc\x96\xe7\xa0\x81'.decode('utf-8'))
- 1
- 2
- 3
- 4
- 5
效果:
字母‘b’,这是代表它是bytes(字节)类型的数据
print(type('编码'))
print(type(b'\xb1\xe0\xc2\xeb'))
print(type(b'\xe7\xbc\x96\xe7\xa0\x81'))
- 1
- 2
- 3
- 4
效果:
- 计算机的编码,就是把字符串类型的数据,转换成bytes类型的数据。
- 计算机的解码,就是把bytes类型的数据,转换成字符串类型的数据。
老骥伏枥,志在千里。烈士暮年,壮心不已。