python笔记——二进制和文件编码

二进制:二进制是数学和数字电路中使用的记数系统,计算机使用的是二进制。因为电子器件只有通电和不通电两种状态,二进制方便计算机进行运算。

用打地鼠解释二进制:先解释一下二进制,举个例子,大家应该都玩过打地鼠。比特是计算机里最小的存储单位,用来存放一位0或1,就好比用来存放一个地鼠的洞(不管地鼠在不在,洞得在)。规定8个比特(bit)构成一个字节(byte)。

流量计算:1B(byte)=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB……我们常说百兆宽带下载速度最多十几兆,这是因为我们理解的单位不一样,运营商说的百兆是百兆bit,我们通常理解的是百兆byte,8倍的关系!

二进制换算十进制:每一个洞(对应比特)都可以对应有地鼠(用1表示)和无地鼠(用0表示)两种状态。那么n个洞就可以表示2^{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())看下。

 

今天就说这么多吧,解释这些个东西真是累。但还是要加油鸭!感觉写出来自己也明白了不少,嘿嘿。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J同学的大气笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值