当前位置: 首页 > 后端技术 > Python

全网最全的“Python编码”教程

时间:2023-03-26 00:47:42 Python

编码一直是Python学习者头疼的问题。你经常看到的gbk和utf-8是什么?因此,今天恰好出一篇教程,讲述一下coding的起源和发展。问题起源我们在学习Python的时候,可能经常会遇到像下面这样的编码问题。有时我们需要选择gbk,有时我们需要选择utf-8。你认为这是结束了吗?我们也遇到了gb2312、gb18030等各种奇怪的编码。那么,编码的起源是什么?今天我们就用“讲故事”的方式带大家认识一下。黄同学给大家讲一个故事1)烽火台兵的故事讲故事之前,我们先看看下图。我们姑且称之为《烽火士兵》的故事吧,那么这个故事与编码问题有什么关系呢?你在哪里联系的?那就听听我的故事吧。这串数字,从右往左看,点亮第一根代表有一个士兵,点亮第二根代表有两个士兵。也就是说,点亮两座烽火台最多可以代表三名士兵。梳理一下逻辑,一个烽火台不亮,就是零兵;如果只有第一个烽火台点亮,则表示有一个士兵;当第二个信标点亮时,第一个信标熄灭,这意味着有两个士兵士兵;如果同时点亮两个烽火台,则表示有三个士兵。总结一下: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位,即一个字节,第1位为扩展位,全0,为以后扩展,其余位不是0就是1。这是因为计算机不是对数字7比较敏感,对2、4、8、16、32等数字比较熟悉,所以把一位展开,变成了8位。那么根据排列组合的知识,ASCII码可以表示2^7=128个码位,即可以表示128个不同的符号。其实这些符号已经足够美国人使用了。这是当时最早的计算机编码(ASCII码),这是老梅当时的计划。2)中国计算机的发展随着世界各地计算机的发展,我们发现原来的码点已经不足以存储很多国家的字符和符号了。为了弄清楚这件事,我们拿中国计算机的发展来举例。解释的例子。通过前面的描述,我们已经知道最早的ASCII码是没有中文的,但是随着中国计算机的普及,我们需要让计算机能够表达中文,怎么办呢?基于此:中国北京大学方正团队发明了gbk码。但是,这些字符一定不能直接放在ASCII码中,因为ASCII码只有8位,最多有2^8=256个空位。存储超过90000个汉字显然是不可能的(连中文常用的3000个汉字也可以存储。不是)。所以在gbk中,汉字用2个字节来表示,变成ASCII码中字节长度的两倍,即gbk占用16位,一共2^16=65536个空位,用来存放常用的就多了汉字,但是仍然不可能把所有的汉字都存储在里面。谁让中华文化源远流长,博大精深。说到gbk,就不得不说说它的兄弟姐妹(如图)。其实它们是一个系列,是随着时代的需要逐渐衍生出来的。这三种不同的代码都是向上兼容的。.可以看出,GB18030代表的字符最多,这也是为什么在使用Python读取Excel表格时,有时GB2312和GBK无法使用,而必须使用GB18030的原因。3)计算机如何兼容多种语言计算机不仅在中国发展起来,全世界的计算机都在飞速发展。如果中国有自己唯一的GBK编码,那么韩国和日本也一定有自己唯一的编码。但当今是“经济全球化”时代,任何国家都不可能独立发展。如果你有国际合作业务,如果你想在国外使用中国写的代码,就会出现乱码。尴尬的?那么这个问题最终是如何解决的呢?为此,美国人发明了一种叫做“Unicode”的东西,也叫“万能码”。其实看名字就知道意思,万能码,万能码一定是要收录世界各国的文字编码!那么什么是Unicode?那就听黄同学告诉你吧。电脑扩展一般都是成倍增加的,要么1字节,2字节,4字节...。原来的Unicode,也叫ucs-2,ASCII用1个字节存储,所以ucs-2用2个字节存储,最多有2^16=65536个空位,还是不能兼容全世界的字符.于是ucs-4产生了,存储用了4个字节,一共2^32=4亿个空位。然而,据统计,全世界的文字、数字和符号的总数只有23万个。对于4亿多空间来说,ucs-4简直就是太浪费空间了。对于文件传输来说,这是一种极大的流量浪费。考虑到节省空间,我们在Unicode的基础上发明了utf-8,一种变长的Unicode字符编码。utf-8,对于英文,采用ASCII码占用方式,占用8位,即1个字节;存储欧文字符时,占用16位,即2个字节;存储中文时占用24位,即3个字节。虽然对中文来说有点浪费篇幅,但是为了统一世界文字,节省篇幅,用这个方法还是很好的(因为毕竟不可能面面俱到,谁做的汉字最多,谁就惨了)小的)。编码知识总结1)字符编码发展史2)以小写字母a为例说明字符编码3)带大家写代码,认识字符编码是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"HuangWei"#如果要在Python3中表达Unicode编码,应该这样写。my_name="HuangWei"说到这里,我们可以得出一个结论:不同编码之间的转换,必须经过一个Unicode。②编码解码>>>name1="我是你的老师">>>name2="你是我的学生">>>#将name1编码成"utf-8">>>name1_encode=name1.encode("utf-8")>>>name1_encodeb'\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")'我是你的老师'---------------------------------------------------------->>>#设置name2编码为“gbk”>>>name2_encode=name2.encode("gbk")>>>name2_encodeb'\xc4\xe3\xc3\xc7\xca\xc7\xce\xd2\xb5\xc4student\xd1\xa7\xc9\xfa'>>>#解码还原name2_encode>>>name2_encode.decode("gbk")'你是我的学生'---------------------------------------------->>>#name1_encode此时是“utf-8”编码,如果用“gbk”解码,会发生什么>>>name1_encode.decode("gbk")'鎴戏槈槧槧抱抱抱镄,eacherkey佸笀'#以上就是我们常说的乱码,乱码,乱码!代码分析:从代码可以看出,如果是utf-8编码,每个汉字存储3个字节;如果是gbk编码,每个汉字存储2个字节。以上就是本次分享的全部内容。想了解更多Python知识,请前往公众号:Python编程学习圈,每日干货分享,送“J”,海量学习资料。