python 的编码方式

161 阅读11分钟

​本文已参与「新人创作礼」活动,一起开启掘金创作之路。​

🌞欢迎来到python的世界
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🌠本阶段属于练气阶段,希望各位仙友顺利完成突破

📆首发时间:🌹2021年4月3日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!

目录

🍈 一、⼆进制运算

🍉二. 字符编码

🍊三,GB2312 & GBK

🍋四、Unicode和UTF-8

🍇图片、声音、视频在计算机中是如何存储的

🍈 一、⼆进制运算

计算机是靠电流驱动的,科学家们是如何做到让电流能理解数字、⽂字、图⽚等⼈类语⾔的呢?

科学家发现,可以通过控制电压把电流分成⾼电压、低电压, ⾼电压可以代表⼀种状态,低电压⼜可代 表另⼀状态。这样计算机就可以识别2种状态了。 就像⼀个灯泡,开灯可以代表1,关灯可以代表0,就 是2种状态 。如果多个灯泡的组合,就可以表达更多的值啦。这跟数学⾥的⼀个叫⼆进制的东东很像, ⼆进制只有0和1两个数,想表达更⼤的值 就往左补位,多个0101010就可以表达更⼤的值 啦。 ⼆进制 是逢2进1, 跟我们⽤的⼗进制逢10进1⼀个原理。 于是科学家们,就⽤2进制做为计算机可识别的最底 层语⾔啦。

🍉二. 字符编码

我们⾃⼰强⾏约定了⼀个表,把⽂字 和数字对应上,这张表就相当于翻译,我们可以拿着⼀个数字来对⽐对应表找到相应的⽂字,反之亦然。

ASCII****编码

⼀个空格对应的数字是0 翻译成⼆进制就是0(注意字符'0'和整数0是不同的)
⼀个对勾√对应的数字是251 翻译成⼆进制就是11111011

假如我们要打印两个空格⼀个对勾 写作⼆进制就应该是 0011111011**, 但是问题来了,我们怎** 么知道从哪⼉到哪⼉是⼀个字符呢?

正是由于这些字符串⻓的⻓,短的短,写在⼀起让我们难以分清每⼀个字符的起⽌位置,所以聪明的⼈ 类就想出了⼀个解决办法,既然⼀共就这255个字符,那最⻓的也不过是11111111⼋位,不如我们就把 所有的⼆进制都转换成8位的,不⾜的⽤0来替换。

这样⼀来,刚刚的两个空格⼀个对勾就写作000000000000000011111011,读取的时候只要每次读8个 字符就能知道每个字符的⼆进制值啦。

计算机容量单位

bit 位,计算机中最⼩的表示单位
8bit = 1bytes 字节,最⼩的存储单位,1bytes缩写为1B
1KB=1024B 
1MB=1024KB 
1GB=1024MB # 电影
1TB=1024GB # 移动硬盘
1PB=1024TB 
1EB=1024PB
1ZB=1024EB
1YB=1024ZB
1BB=1024YB

🍊三,GB2312 & GBK

英⽂问题是解决了, 我们中⽂如何显示呢? 美国佬设计ASSCII码的时候应该是没考虑中国⼈有⼀天也 能⽤上电脑, 所以根本没考虑中⽂的问题,上世界80年代,电脑进⼊中国,把砖家们难倒了,妈的你 个⼀ASSCII只能存256个字符,我常⽤汉字就⼏千个,怎么玩???勒紧裤腰带还苏联贷款的时候我们 都挺过来啦,这点⼩事难不到我们, 既然美帝的ASCII不⽀持中⽂,那我们⾃⼰搞张编码表不就⾏了, 于是我们1980年设计出了GB2312编码表,⻓成下⾯的样⼦。⼀共存了6763个汉字。

这个表格⽐较⼤,像上⾯的⼀块块的⽂字区域有72个,这导致通过⼀个字节是没办法表示⼀个汉字的 (因为⼀个字节最多允许256个字符变种,你现在6千多个,只能2个字节啦,2**16=65535个变种)。 有了gb2312,我们就能愉快的写中⽂啦。

但我们写字竟然会出现中英混杂的情况,⽐如“我是路⻜学城,我的英⽂名叫Luffffycity.”, 这种你怎么 办?这就要求你必须在gb2312⾥同时⽀持英⽂,但是还不能是2个字节表示⼀个英⽂字⺟。⼈家ASCII ⽤⼀个字符,你⽤2个,那⼀个2mb⼤⼩的英⽂⽂档只要⼀改编码,就⽴刻变成4mb, 太坑爹,中国⼈你 有钱也不能这么造呀。 所以中国砖家们⼜通过神奇⼿段兼容了ASSCII, 即遇到中⽂⽤2个字节,遇到英⽂ 直接⽤ASCII的编码。怎么做到的呢?

如何区别连在⼀起的2个字节是代表2个英⽂字⺟,还是⼀个中⽂汉字呢? 中国⼈如此聪明,决定, 2个字节连在⼀起,且每个字节的第1**(也就是相当于128的那个2进制位)如果是1****,就代表这是个中** ⽂,这个⾸位是128的字节被称为⾼字节。 也就是2个⾼字节连在⼀起,必然就是⼀个中⽂。

你怎么如 此笃定?因为0-127已经表示了英⽂的绝⼤部分字符,128-255是ASCII的扩展表,表示的都是极特殊的 字符,⼀般没什么⽤。所以中国⼈就直接拿来⽤了。 ⾃1980年发布gb2312之后,中⽂⼀直⽤着没啥问题,随着个⼈电脑进⼊千家万户,有⼈发现,⾃⼰的 名字竟然打印不出来,因为起的太⽣僻了。 于是1995年, 砖家们⼜升级了gb2312, 加⼊更多字符,连什么藏语、维吾尔语、⽇语、韩语、蒙古语 什么的统统都包含进去了,国家统⼀亚洲的ᰀ⼼从这些基础⼯作中就可⻅⼀斑哈。 这个编码叫GBK,⼀ 直到现在,我们的windows电脑中⽂版本的编码就是GBK.

编码战国时代

很多国家都有自己的编码

解决乱码:

1.中国电脑 上装⽇本 shift_jis

2. 让⽇本 游戏⼚商,⽤gbk编码

中国⼈在搞⾃⼰编码的同时,世界上其它⾮英语国家也得⽤电脑呀,于是都搞出了⾃⼰的编码,你可以 想得到的是,全世界有上百种语⾔,⽇本把⽇⽂编到Shift_JIS⾥,韩国把韩⽂编到Euc-kr⾥, 各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语⾔混合的⽂本中,显示出来会有乱 码。之前你从玩个⽇本游戏,往⾃⼰电脑上⼀装,就显示乱码了。

这么乱极⼤了阻碍了不同国家的信息传递,于是联合国出⾯,发誓要解决这个混乱局⾯。

因此,Unicode应运⽽⽣。Unicode把所有语⾔都统⼀到⼀套编码⾥,这样就不会再有乱码问题了。

🍋四、Unicode和UTF-8

Unicode 2-4字节 已经收录136690个字符,并还在⼀直不断扩张中…

Unicode标准也在不断发展,但最常⽤的是⽤两个字节表示⼀个字符(如果要⽤到⾮常偏僻的字符,就

需要4个字节)。现代操作系统和⼤多数编程语⾔都直接⽀持Unicode

Unicode有2个特点:

1. ⽀持全球所有语⾔

2. 可以跟各种语⾔的编码⾃由转换,也就是说,即使你gbk编码的⽂字 ,想转成unicode很容易。 为何unicode可以跟其它语⾔互相转换呢? 因为有跟所有语⾔都有对应关系哈,这样做的好处是可以让 那些已经⽤gbk或其它编码写好的软件容易的转unicode编码 ,利于unicode的推⼴。 下图就是成unicode跟中⽂编码的对应关系新的问题⼜出现了:如果统⼀成Unicode编码,乱码问题从此消失了。但是,如果你写的⽂本基本上全 部是英⽂的话,⽤Unicode编码⽐ASCII编码需要多⼀倍的存储空间,由于计算机的内存⽐较⼤,并且 字符串在内容中表示时也不会特别⼤,所以内容可以使⽤unicode来处理,但是存储和⽹络传输时⼀般 数据都会⾮常多,那么增加1倍将是⽆法容忍的!!! 为了解决存储和⽹络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对

unicode字符进⾏转换,以便于在存储和⽹络传输时可以节省空间!

UTF-8: 使⽤1、2、3、4个字节表示所有字符;优先使⽤1个字节、⽆法满⾜则使增加⼀个字节,

最多4个字节。英⽂占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个

UTF-16: 使⽤2、4个字节表示所有字符;优先使⽤2个字节,否则使⽤4个字节表示。

UTF-32: 使⽤4个字节表示所有字符;

总结:UTF 是为unicode编码 设计 的⼀种 在存储 和传输时节省空间的编码⽅案。

如果你要传输的⽂本包含⼤量英⽂字符,⽤UTF-8编码就能节省空间:

UTF-8编码有⼀个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编 码的⼀部分,所以,⼤量只⽀持ASCII编码的历史遗留软件可以在UTF-8编码下继续⼯作。

搞清楚了ASCIIUnicodeUTF-8的关系,我们就可以总结⼀下现在计算机系统通⽤的字符编码⼯作⽅式:

在计算机内存中,统⼀使⽤Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编 码。 ⽤记事本编辑的时候,从⽂件读取的UTF-8字符被转换为Unicode字符到内存⾥,编辑完成后,保存的 时候再把Unicode转换为UTF-8保存到⽂件

🍇图片、声音、视频在计算机中是如何存储的

以上图片选自(如有侵权,请联系,马上修改)

www.bilibili.com/video/BV1Gv…