由于计算机只能处理数字,因此若是要处理文本,就得先把文本转换成数字才能处理。编码
最先计算机在设计时采用8bit做为一个字节(byte),因此一个字节能标识的最大整数就是255「11111111(B) = 255」,0-255被用来标识大小写英文字母、数字和一些符号,这个编码表就被称为ASCII编码。加密
若是要用来表示中文(汉字数量大约近10w个),显然一个字节是不够的,至少须要两个字节。并且还不能和ASCII编码表冲突,因此中国指定了GB2312编码,用来编码中文。 相似的,其余语言也面临这个问题,为了统一全部文字的编码,Unicode应运而生。设计
Unicode一般使用两个字节来表示一个字符,全部的英文编码从单字节变成了双字节,把高字节所有填0补齐。3d
目前Unicode字符分为17组编排,0x0000至0x10FFFF,每组称为平面(Plane),而没平面拥有65535个码位,共1114112个,然而目前只用了少数平面。code
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode可变长度字符编码。orm
字符集:为每个字符分配一个惟一的ID(码位/码点/Code Point) 编码规则:将码位转换为字节序列的规则(编码/解码 => 加密/解密)cdn
UTF-8是一种变长字节编码方式。最小编码单位(code unit)为一个字节。一个字节的前1-3个bit为描述性部分,后面为实际序号部分。blog
Unicode符号范围「十六进制」 | UTF-8编码「二进制」 |
---|---|
0000 0000-0000 007F | 0xxxxxxxx |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx |
综上:若是一个字节的第一位是0,则这个字节单独就是一个字符;若是第一位是1,则连续有多少个1,就表示当前占用多少个字节。unicode
举例:字符串
秃
的unicode为79C3「0111 1001 1100 0011(B)」,根据上表处于 (0000 0080-0000 FFFF)范围内,所以UTF-8须要三个字节,即格式为1110xxxx 10xxxxxx 10xxxxxx,将unicode从最后一位往前依次填入格式x中,多出的补0。能够得出UTF-8编码为11100111 10100111 10000011,转为十六进制为E7A783。
以上面秃
为例,unicode码为79C3,须要两个字节存储,一个字节是79,另外一个字节是C3。存储的方式79在前,C3在后,就是Big endian(大头方式);C3在前,79在后就是Little endian(小透方式)
Base64是一种基于64个可打印的字符来标识二进制数据的标识方法。可打印的字符包括字母A-Z、a-z、数字0-9,这样公有62个字符,此外两个可打印的符号在不一样系统中而不一样。
在MIME格式的的电子邮件中,另外两个符号为加号+和斜杠/,等号=用来作后缀用途。
综上得出: