因为计算机语言是一组高低电平,高电平表明1,低电平表明0,计算机中的全部信息都是以二进制代码的形式存在的,不管是文字、图片、声音,仍是影像、游戏......python
相似于摩斯电码,为了让人们能看懂这些二进制代码,美国人最早制定了一种编码规则——ASCII码,用于理解二进制代码到底表明的是哪些字符,ASCII码使用指定的7个二进制位组合,这些组合所能表示的128个整数用来表明大小写字母、0到9的数字、控制字符、通讯专用字符、空格符、运算符号、标点符号等的编号,经过编号能够找到一一对应的字符,ASCII码一般会额外使用一个扩充的二进制位,虽然这个二进制位可能并不表明任何意思,可是能够方便以一个字节的方式存储每一个字符ui
在美国计算机装的英文系统上的编码表多是ASCII码也多是EBCDIC码,而编码格式也必定是ASCII编码格式,才能在输出文本和打开文本时不出现乱码编码
ASCII码只能知足英文在计算机上通讯的须要,为了扩充ASCII编码,也为了知足其余语言的通讯须要,各国也都制定了各自的属于本国语言的字符编码来方便在计算机上通讯,例如我国的GBKcode
在GBK编码体系下,有些字符使用双字节组合来表示,须要知道GBK编码标准兼容GB2312,GB2312采用了二维矩阵编码法对全部字符进行编码,它是一个94行94列的方阵,对每一行称为一个“区”,每一列称为一个“位”,而后将全部字符依照编码表的规律填写到方阵中。这样全部的字符在方阵中都有一个惟一的位置,这个位置能够用区号、位号合成表示,称为字符的区位码。如第一个汉字“啊”出如今第16区的第1位上,其区位码为1601。由于区位码同字符的位置是彻底对应的,所以区位码同字符之间也是一一对应的。这样全部的字符均可经过其区位码转换为数字编码信息
GBK编码中,每一个字节的第一个二进制位会被当作标志位,标志位为1则表示是中文字符,标志位为0则表示为英文字符orm
为了使计算机支持更多的语言,Windows(也多是美国别的某机构)制定了一种编码格式——ANSI编码格式(又称MBCS:Muilti-Bytes Charecter Set,多字节字符集),这个ANSI编码收录了中国制定的GBK编码,因此在计算机上装的“简体中文Windows系统”中使用的ANSI编码格式就是GBK编码,而在日本装的日文Windows系统中使用的ANSI编码格式就是Shift_JIS编码blog
虽然各国都有本身的字符编码,可是却没法在计算机上互通,由于在制定编码的时候,都有各自的编码规则,有可能两个国家使用了相同的二进制组合却表明的是各自国家语言的不一样字符。为何有时候电子邮件和网页都常常会出现乱码,就是由于信息的提供者多是日文的ANSI编码体系,而信息的读取者多是中文的编码体系,他们对同一个二进制编码值进行显示,采用了不一样的编码,致使乱码。这个问题促使了unicode码的诞生游戏
Unicode是一个很大的字符编码规则,它收录了中文、英文、日文还有别的各类国家的语言的编码表。Unicode是一个庞大的集合,如今的规模能够容纳100多万个符号。每一个符号的编码都不同,好比:U+0041表示英语的大写字母A,“汉”这个字的Unicode编码是U+6C49
在咱们编写代码时,能够在赋值的时候利用“U+ ”的方法,好比在pycharm中图片
x = u'你是我のgirl friend' ##这个“x”是Unicode格式的数据,不管怎么打印,都不会乱码
Unicode当然统一了编码方式,可是它的效率不高,好比UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每一个英文字母前都必然有三个字节是0,这对存储和传输来讲都很耗资源。而不这样规定的话,有的字符是一个字节,有的字符是两个字节组合,计算机在读取的时候就不知道按照那种规则读取内容了,就会形成乱码,因此Unicode虽然结决了这种问题,可是若是存储的话可能会对内存形成很大的浪费并且读取的速度也会比较慢,这样就须要一种存储规则,将写好的Unicode编码转换成占内存较小的编码格式,解决读写问题内存
utf-8是一种编码规则,是为了更好的存储和读取用Unicode编写的编码utf-8
utf-8能够将本来的Unicode码进行transformation(转换),这种转换就是给每一个Unicode码进行标记,使得让计算机看到某个标记就知道待会要读取几个字节的代码
编码规则 | 二进制代码 |
---|---|
GBK | 1001 0110 1000 0001 |
Unicode/UCS-4 | 0000 0000 0000 0000 xxxx xxxx xxxx xxxx |
UTF-8 | 1101 0110 1000 0001 |