ASCII,Unicode,UTF-8和Base64

由于计算机只能处理数字,因此若是要处理文本,就得先把文本转换成数字才能处理。编码

ASCII

最先计算机在设计时采用8bit做为一个字节(byte),因此一个字节能标识的最大整数就是255「11111111(B) = 255」,0-255被用来标识大小写英文字母、数字和一些符号,这个编码表就被称为ASCII编码。加密

Unicode

若是要用来表示中文(汉字数量大约近10w个),显然一个字节是不够的,至少须要两个字节。并且还不能和ASCII编码表冲突,因此中国指定了GB2312编码,用来编码中文。 相似的,其余语言也面临这个问题,为了统一全部文字的编码,Unicode应运而生。设计

Unicode一般使用两个字节来表示一个字符,全部的英文编码从单字节变成了双字节,把高字节所有填0补齐。3d

目前Unicode字符分为17组编排,0x0000至0x10FFFF,每组称为平面(Plane),而没平面拥有65535个码位,共1114112个,然而目前只用了少数平面。code

UTF-8

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode可变长度字符编码。orm

UTF-8 与 Unicode区别

  • Unicode 是 「字符集」
  • UTF-8 是 「编码规则」

字符集:为每个字符分配一个惟一的ID(码位/码点/Code Point) 编码规则:将码位转换为字节序列的规则(编码/解码 => 加密/解密)cdn

UTF-8编码规则

UTF-8是一种变长字节编码方式。最小编码单位(code unit)为一个字节。一个字节的前1-3个bit为描述性部分,后面为实际序号部分。blog

  1. 对于单字节字符,占用一个字节空间。0以后的全部部分(7个bit)表明Unicode中的序号。所以对于英文字母,UTF-8编码和ASCII码是相同的。
  2. 对于n字节字符,第一个字节的前n为都为1,第n+1为0,后面字节的前两位上为10.剩下没有说起的二进制位为这个符号的unicode码。
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。

Little endian & Big endian

以上面为例,unicode码为79C3,须要两个字节存储,一个字节是79,另外一个字节是C3。存储的方式79在前,C3在后,就是Big endian(大头方式);C3在前,79在后就是Little endian(小透方式)

Base64

Base64是一种基于64个可打印的字符来标识二进制数据的标识方法。可打印的字符包括字母A-Z、a-z、数字0-9,这样公有62个字符,此外两个可打印的符号在不一样系统中而不一样。

在MIME格式的的电子邮件中,另外两个符号为加号+和斜杠/,等号=用来作后缀用途。

编码转换方式

  1. 将每三个字节做为一组,一共24个二进制位。
  2. 将这24个二进制位分为4组,每一个组有6个二进制位。
  3. 在每组前面加两个00,扩展成32个二进制位,及四个字节。
  4. 而后根据下表获得扩展后的每一个字节的编号,这就是Base64的编码值。

-w961

综上得出:

  • Base64字符标中的字符本来用6bit就能够表示,如今前面添加2个0,变为8bit,致使Base64编码后的文本大小比原文大约三分之一
  • 为何使用3个字节一组呢?由于6和8的最小公倍数是24,三个字节正好24个二进制位,每6bit一组,刚好可以分为4组。

举例以下:

  1. "Man"、"a"、"n"的ASCII值分别为7七、9七、110,对应的二进制值为0100110一、0110000一、01101110,将他们连成24位的二进制字符串010011010110000101101110。
  2. 将24位的二进制字符串分为四组,即:0100十一、0101十、00010一、101110。
  3. 在每组前面加00,扩展成32个二进制位,即000100十一、000101十、0000010一、00101110。
  4. 根据上表,获得Base64编码为T、W、F、u。

位数不足3位处理

  1. 二位的状况:两个字节工共16个二进制位,按照上面方式分组,每6个一组,则第三组缺乏2位,用0补齐。如"Ma"能够转换为三组000100十一、000101十、00010000,对应的Base64值分别为T、W、E,再补上一个"="号,所以"Ma"的Base64编码为"TWE="
  2. 一位的状况:一字节工8个二进制位,按照上面方式分组,每6个一组,则第二组缺乏4位,用0补齐。如"M"能够转换为000100十一、00010000,对应的Base64位的值分别为:T、Q,再补上两个"="号,所以"M"的Base64编码就是TQ==

注意事项

  • 大多数编码都是由字符串转换为二进制的过程,而Base64的编码则是从二进制转为字符串。
  • Base64主要用在传输,存储,表示二进制领域,不能算得上加密,只是没法直接看到铭文。
  • 中文有不少编码(好比:UTF-八、GB23十二、GBK等),不一样的编码对应的Base64编码结果不同。
相关文章
相关标签/搜索