二进制:二进制是数学和数字电路中使用的记数系统,计算机使用的是二进制。因为电子器件只有通电和不通电两种状态,二进制方便计算机进行运算。
用打地鼠解释二进制:先解释一下二进制,举个例子,大家应该都玩过打地鼠。比特是计算机里最小的存储单位,用来存放一位0或1,就好比用来存放一个地鼠的洞(不管地鼠在不在,洞得在)。规定8个比特(bit)构成一个字节(byte)。
流量计算:1B(byte)=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB……我们常说百兆宽带下载速度最多十几兆,这是因为我们理解的单位不一样,运营商说的百兆是百兆bit,我们通常理解的是百兆byte,8倍的关系!
二进制换算十进制:每一个洞(对应比特)都可以对应有地鼠(用1表示)和无地鼠(用0表示)两种状态。那么n个洞就可以表示种状态。
0=0,1=1,00=0,01=1,10=2,11=3,000=0,001=1,010=2,011=3,100=4,……以此类推。
编码的本质:相当于一种翻译。计算机最早发明的时候就是计算工具,只是用来处理数字。但随着计算机发展,人们还想让它认识我们的语言符号,那就需要一个翻译,将形态各异的人类语言翻译给只能理解0和1的计算机,并将数据转换为二进制进行存储和传输。
字符编码可以阅读一下百度百科:https://baike.baidu.com/item/字符编码/8446880?fr=aladdin#2
接下来我们简单按历史顺序介绍一下各种编码。
ACSII码:美国人来最早,那就把52个英文大小写字母+数字+还有一些其他常用符号(#,*,@等)对应到二进制,算来也就100来个,用7个比特位就够了。标准ACSII码对应7个二进制位。
扩充ASCII码:后来欧洲人也来了,虽然欧洲大部分也是用英文字母,但还是有很多不一样啊,比如法语中英文字母上还带符号的呢。所以在欧洲,ACSII码扩充到8个比特位(刚好计算机一般按字节(byte=8bit)为基本处理单位)。
GB2312:好了,现在中国人来了,这下头大了,中国人用的汉字,美国人欧洲人编的ACSII码根本没法用啊,于是勤劳的中国人自己编了一张GB2312编码表,用2个字节来表示大部分汉字(65535个)。
GBK: 没办法中文博大精深,来个GBK才能显示更多更完整的中国汉字。相当于GB2312的升级版。
其他编码和乱码:其他好多国家也搞自己的编码标准。所以一旦用的编码表不同,就会出现乱码现象。现在你知道你经常打开excel/word看到的哪些鬼画符怎么来的了吧。编码表搞错了呗,就好像一个中国人听到一句法语,"Bonjour",他硬要用汉语的声音解释:“棒猪呵!”那哪能懂他说的是什么嘛,这样子去理解别的语言听起来不就是鬼话连篇嘛。
Unicode(万国码): 为了方便地球上所有人沟通,人们创造了unicode(相当于世界通用语言),unicode把世界上几乎所有符号都收进来(现在unicode中有100多万个符号)。优缺点:unicode虽然能解决乱码问题,但是它为了表示更多的符号就占用了两个字节(16个比特位)。这就造成了计算机存储空间的浪费,用一句俗气的话解释unicode导致很多字符处于“一个字符拉屎却要占着十几个坑”的状态,你说是不是浪费资源!因此UTF-8应运而生!
UTF-8:是针对unicode的可变长度字符编码(可以用1~4个字节表示一个符号)。比如字符全在ASCII码范围内,UTF-8就只用一个字节,所有UTF-8向下兼容ASCII码。好家伙,真是厉害!
Unicode和UTF-8的区别:简单来说就是,Unicode是字符集,将字符和码位一一对应起来;而UTF-8实质上是一种编码规则,它根据Unicode中对应每个字符的比特位的长度将其对应到1~4个字节(最长可以有6个)。
讲了一大堆,下面还是要晒晒代码,很简单,没啥技术含量:
编码注释:比如我在spyder新建了一个py脚本,第一行会自动出现一个编码注释:
# -*- coding: utf-8 -*-
这个注释就是说在我没有特殊声明的情况下,python自动选择UTF-8编码。
编码:encode()
解码:decode()
print('砍柴姑娘'.encode('utf-8'))#砍柴姑娘按utf-8编码
print('砍柴姑娘'.encode('gbk'))#砍柴姑娘按gbk编码
print(b'\xe7\xa0\x8d\xe6\x9f\xb4\xe5\xa7\x91\xe5\xa8\x98'.decode('utf-8'))#按utf-8解码
print(b'\xbf\xb3\xb2\xf1\xb9\xc3\xc4\xef'.decode('gbk'))#按gbk解码
那这里b'\xbf\xb3\xb2\xf1\xb9\xc3\xc4\xef'这种奇奇怪怪的字符其实就是bytes类型数据,不信你print(type())看下。
今天就说这么多吧,解释这些个东西真是累。但还是要加油鸭!感觉写出来自己也明白了不少,嘿嘿。