全网讲解 “Python编码“ 最全的教程了!新手快看,没有之一

37 篇文章 0 订阅

人生苦短,快学Python!

编码问题一直是Python学习者一个头疼的问题,经常看到的gbkutf-8,这都是啥玩意儿?因此,有朋友让我出一期教程,好好讲述一下编码的起源和发展。抽个空,为大家出了这期教程。

问题起源

我们在学习Python的过程中,可能会经常遇到下方这样的编码问题。有时候我们需要选择gbk,有时候需要选择utf-8。你以为这样就完了吗?我们碰到的还有gb2312gb18030等各种奇奇怪怪的编码。那么,编码的起源究竟是怎样的呢?我们今天就用**“讲故事”**的方式,带你认识一下它。

给大家讲个故事


1)烽火士兵的故事

在正式讲故事之前,我们先来看一下下方这张图,我们暂且称其为**《烽火士兵》**的故事,那么这个故事究竟是怎么与编码问题扯上联系的呢?接着听我讲故事。

这一串数字,从右朝左看

点燃第1根,代表有一个士兵,点燃第2根,代表有二个士兵。那么也就是说,点燃2个烽火,最多可以表示三个士兵。梳理一下逻辑,1个烽火都不点,表示有零个士兵;只点燃第1个烽火,就表示有一个士兵;在点燃第2个烽火的时候,熄灭第1个烽火,就表示有二个士兵;同时点燃2个烽火,就表示有三个士兵。

综上所述:2根烽火,可以表示:0、1、2、3个士兵,即1+2。3根烽火,可以表示:0、1、2、3、4、5、6、7个士兵,即1+2+4。依此类推下去…

通过上面的叙述,你可能已经发现了,这不就是类似计算机里面的二进制数字吗?只有0和1,0表示熄灭烽火,1表示点燃烽火。对应到计算机中就是,0表示关,1表示开。下面黄同学就带着大家说一下**“计算机中的0和1”**。

计算机的底层是电路,只认识0和1,就是你初中物理中所谓的“电路”,0表示关,1表示开,没有别的玩意儿。但是你想呀,一个电路只有0和1的话,怎么展示出这绚丽多彩的世界呢?因此,聪明的老外,把日常所用的文字和符号,编码成0101010…类型,这样电脑就能够表示文字了。所以,先记住一个关键语:“用什么编码,就用什么解码”

由于,计算机是由美国人发明的。因此,最早的计算机编码:ASCII码(也是服务于美国人的),里面只有美国人日常所用的26个英文字母、数字、标点等常用字符,所以,最早的计算机也只有英文、数字、标点等特殊字符。不要惊叹为啥只有美国人常用的英文字母和符号,因为老美当时就没有想过计算机会迅速在全世界普及开来,谁也不能提前预知未来。

接着我们来说说最早的计算机编码:ASCII码。ASCII码占8个比特位,也就是一个字节,其中最前面一个位是扩展位,都是0,为了日后扩展所用,其余位置不是0就是1。这是由于计算机对数字7不敏感,熟悉2、4、8、16、32…等数字,所以扩展了一位,成了8位。那么根据排列组合的知识,ASCII码可以表示2^7=128个码位,即可以表示128种不同的符号,其实这些符号已经够美国人使用了。这就是当时最早的计算机编码(ASCII码),这就是当时老美的打算。

2)计算机在中国的发展

随着计算机在世界各地的发展,我们发现原有的码位已经不够存放多国的文字和符号了,为了讲清楚这件事儿,我们以计算机在中国的发展为例,进行说明。

通过前面的叙述,我们已经知道最早的字符编码ASCII码中,并没有中文,但是随着计算机在中国的普及,我们必要要让计算机中能够表示中文呀,怎么办呢?基于此:中国北大方正团队,发明了gbk编码。但是这些字符肯定不能直接往ASCII码里面放,因为ASCII只有8位,最多才有28=256**个空位,存放九万多汉字,显然不可能(就连中文中常用的3000汉字,也存放不了)。所以在gbk中,汉字用2个字节表示,变成了ASCII码中字节长度的2倍,即gbk占16位,共**216=65536个空位,这个对于存放常用汉字,多得多,但是,仍然不能将所有汉字存放进去,谁让中华文化源远流长,博大精深呢。

说到gbk,就不得不说它的兄弟姐妹了(如图所示),其实它们是一个系列,都是由于当时的需要,逐步衍生出来的,这三种不同的编码都是向上兼容的。可以看出:GB18030表示的字符数最多,这也就是为什么有时候使用Python读取Excel表时,使用GB2312和GBK都不行,而必须使用GB18030的原因了。

3)计算机如何兼容多国语言

计算机不仅在中国发展开来,其实计算机是在全世界迅速发展开来。如果说中国有自己独有的GBK编码,那么韩国、日本肯定也有它们自己独有的编码。但是当今是“经济全球化”的时代,任何一个国家都不可能的单独发展,假如你有一个国际合作的业务,我们在中国写的代码,要是想拿到国外去用,出现乱码,这样多尴尬?那么这个问题最终是怎么解决的呢?

为此,美国人又发明了一个叫做“Unicode”的东西,又叫做“万国码”。其实完全可以见名知意,万国码万国码,肯定是为了包含全世界的字符编码!那么什么是万国码呢?接着听黄同学给你讲。

计算机扩展一般是成倍增加的,要么是1个字节、2个字节、4个字节…。最开始的Unicode,又叫ucs-2,ASCII存储采用1个字节,因此ucs-2采用2个字节进行存储,最多有216=65536个空位,这样仍然无法兼容全世界的字符。于是ucs-4产生了,存储采用4个字节,共232=4亿多个空位。但是据统计,全世界文字、数字、符号信息加起来也就23万,对于4亿多空间来说,ucs-4简直太浪费空间了,这个对于文件传输来说,及其浪费流量。

考虑到节省空间,在Unicode基础上,我们又发明了utf-8,一种可变长的Unicode字符编码。Utf-8,对于英文来说,采用ASCII码占位方式,占8位,即1个字节;存放欧洲文字时,占16位,即2个字节;存放中文时,占24位,即3个字节。虽然对于中文来说很浪费空间,但是为了能把全世界文字都统一起来,又为了节省空间,采用这种方式,已经很好了(因为毕竟不可能做到面面俱到,谁让中国字符最多,会吃亏一点)。

编码知识总结

1)字符编码发展史

2)以小写字母a为例,说明字符编码

3)带着大家写写代码,认识一下字符编码

① 关于Python2和Python3的区别

在Python2中,默认字符编码是ASCII码,因此在Python2中写中文,首行一般都会加上-- coding:utf-8 --,看了这篇文章,我想你对这个东西已经有了一个清楚的认识。但是Python2现在已经停止更新了,我们了解即可,不用太关注。

对于Python3.x来说,默认字符编码是utf-8,而utf-8是Unicode的扩展集。即Python3.x中默认所有的字符都是Unicode。说白点,我们在Python3.x中随便写点啥,编码就是Unicode编码。

对比Python2和Python3:

# 在Python2中如果要表示Unicode编码,应该这样写。  
my_name = u"黄伟"  
# 在Python3中如果要表示Unicode编码,应该这样写。  
my_name = "黄伟"  

说到这里,我们可以下一个结论:不同编码之间的转换,都要经过一个Unicode。

② encode编码和decode解码

>>> name1 = "我是你们的teacher老师"  
>>> name2 = "你们是我的student学生"  
>>> # 将name1编码为“utf-8”  
>>> name1_encode = name1.encode("utf-8")  
>>> name1_encode  
b'\xe6\x88\x91\xe6\x98\xaf\xe4\xbd\xa0\xe4\xbb\xac\xe7\x9a\x84teacher\xe8\x80\x81\xe5\xb8\x88'  
>>> # 将name1_encode解码还原  
>>> name1_encode.decode("utf-8")  
'我是你们的teacher老师'  
---------------------------------------------------------  
>>> # 将name2编码为“gbk”  
>>> name2_encode = name2.encode("gbk")  
>>> name2_encode  
b'\xc4\xe3\xc3\xc7\xca\xc7\xce\xd2\xb5\xc4student\xd1\xa7\xc9\xfa'  
>>> # 将name2_encode解码还原  
>>> name2_encode.decode("gbk")  
'你们是我的student学生'  
-------------------------------------------------  
>>> # name1_encode此时是“utf-8”编码,如果用“gbk”解码,会出现什么?  
>>> name1_encode.decode("gbk")  
'鎴戞槸浣犱滑鐨則eacher鑰佸笀'  
# 上面就是我们常说的乱码、乱码、乱码!  

代码分析:从代码中可以看出,如果是utf-8编码,每个中文字符就是3个字节存储。如果是gbk编码,每个中文字符就是2个字节存储。

人生苦短,快学Python!,大家还有好的点子,欢迎评论区留言~

最后这里免费分享给大家一套免费的学习资料,包含视频、源码。课件,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以加我微信一起来学习交流。

Python所有方向的学习路线图,清楚各个方向要学什么东西

100多节Python课程视频,涵盖必备基础、爬虫和数据分析

100多个Python实战案例,学习不再是只会理论

华为出品独家Python漫画教程,手机也能学习

历年互联网企业Python面试真题,复习时非常方便
在这里插入图片描述

上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以直接划到文末免费领取【保证100%免费

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

在这里插入图片描述

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

在这里插入图片描述

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、清华编程大佬出品《漫画看学Python》

用通俗易懂的漫画,来教你学习Python,让你更容易记住,并且不会枯燥乏味。

在这里插入图片描述
配套600集视频:

在这里插入图片描述

六、面试资料

我们学习Python必然是为了找到高薪的工作,给大家准备好了简历模板以及面试者真题,这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以点击下方CSDN官方认证微信名片免费领取↓↓↓【保证100%免费

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值