ASCII编码
这张表就是计算机显示各种⽂字、符号的基⽯
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字⺟的⼀套电脑编码系统,主要⽤于显示现代英语和其他⻄欧语⾔。它是现今最通⽤的单字节编码系统,并等同于国际标准ISO/IEC 646。
由于计算机是美国⼈发明的,因此,最早只有127个字⺟被编码到计算机⾥,也就是⼤⼩写英⽂字⺟、数字和⼀些符号,这个编码表被称为 ASCII 编码,⽐如⼤写字⺟ A 的编码是 65 ,⼩写字⺟ z 的编码是 122 。后128个称为扩展ASCII码。
那现在我们就知道了上⾯的字⺟符号和数字对应的表是早就存在的。那么根据现在有的⼀些⼗进制,我们就可以转换成⼆进制的编码串。
⽐如:⼀个空格对应的数字是0 翻译成⼆进制就是0(注意字符'0'和整数0是不同的)⼀个对勾√对应的数字是251 翻译成⼆进制就是11111011
提问:假如我们要打印两个空格⼀个对勾 写作⼆进制就应该是 0011111011, 但是问题来了,我们怎么知道从哪⼉到哪⼉是⼀个字符呢?
论断句的与必要性:之前在⽹上看到个新闻,讲是个⼩偷在上海被捕时⾼喊道:“我⼀定要当上海贼王!”
正是由于这些字符串⻓的⻓,短的短,写在⼀起让我们难以分清每⼀个字符的起⽌位置,所以聪明的⼈类就想出了⼀个解决办法,既然⼀共就这255个字符,那最⻓的也不过是11111111⼋位,不如我们就把所有的⼆进制都转换成8位的,不⾜的⽤0来替换。这样⼀来,刚刚的两个空格⼀个对勾就写作000000000000000011111011,读取的时候只要每次读8个字符就能知道每个字符的⼆进制值啦。
计算机容量单位
在这⾥,每⼀位0或者1所占的空间单位为bit(⽐特),这是计算机中最⼩的表示单位
每8个bit组成⼀个字节,这是计算机中最⼩的存储单位(毕竟你是没有办法存储半个字符的)orz~
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,我们就能愉快的写中⽂啦。但我们写字竟然会出现中英混杂的情况,⽐如“我是路⻜学城,我的英⽂名叫Luffycity.”, 这种你怎么办?这就要求你必须在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.
UTF-8
新的问题⼜出现了:如果统⼀成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编码就能节省空间:
字符 ASCII Unicode UTF-8
A 01000001 00000000 01000001 01000001
中 x 01001110 00101101 11100100 10111000 10101101
从上⾯的表格还可以发现,UTF-8编码有⼀个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的⼀部分,所以,⼤量只⽀持ASCII编码的历史遗留软件可以在UTF-8编码下继续⼯作。
搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结⼀下现在计算机系统通⽤的字符编码⼯作⽅式:
在计算机内存中,统⼀使⽤Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。⽤记事本编辑的时候,从⽂件读取的UTF-8字符被转换为Unicode字符到内存⾥,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到⽂件。
常用编码介绍一览表
Py2 Vs Py3编码
python⽣下来的时候 还没有unicode&utf-8, 所以⻳叔选⽤的默认编码只能是ASCII, ⼀直到py2.7,⽤的还是ASCII, 导致Py默认只⽀持英⽂,想⽀持其它语⾔,必须单独配置。
Alexs-MacBook-Pro:day2 alex$ more py2编码_ascii.py
print("⼩猿圈")
Alexs-MacBook-Pro:day2 alex$ python2.7 py2编码_ascii.py
File "py2编码_ascii.py", line 2
SyntaxError: Non-ASCII character '\xe5' in file py2编码_ascii.py on line 2, but
no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
直接写中⽂执⾏会报错的。
需在⽂件开头声明⽂件的编码才能写中⽂
# -*- encoding:utf-8 -*-
print("⼩猿圈")
再执⾏就不会有错了。
不过注意如果你的电脑 是windows系统 , 你的系统默认编码是GBK ,你声明的时候要声明成GBK, 不能是utf-8, 否则依然是乱码,因为gbk⾃然不认识utf-8.
在Py2⾥编码问题⾮常头疼,若不是彻底理解编码之间的各种关系,会经常容易出现乱码⽽不知所措。
到了Py3推出后,终于把默认编码改成了unicode, 同时⽂件存储编码变成了utf-8,意味着,不⽤任何声明,你就可以写各种语⾔⽂字在你的Python程序⾥。 从此,程序们⼿牵⼿过上了快乐的⽣活。