ASCII、unicode、utf

机器只认识10,因此人为了能用本身的语言与机器交互,规定出了各类二进制与语言字符的对应关系,即编码javascript

ASCII编码

最先普及的编码集为ASCII码,它用一个字节(8位二进制)规定了128个字符的编码(首位二进制统一为0,2^7个),主要都是英文字符。java

ASCII编码

英语使用ASCII中规定的128个字符就足够了,可是却远远不足以表示其余语言,即便是利用上首位的二进制,因而出现了各国语言的编码,好比支持简体中文的GB2312,支持繁体中文的BIG5。使得在解析文件时还须要注意它的编码格式,不然就会乱码,由于不一样的编码对二进制会有不一样的解读。编码

语言 字符集 正式名称
英语、西欧语 ASCII,ISO-8859-1 MBCS 多字节
简体中文 GB2312 MBCS 多字节
繁体中文 BIG5 MBCS 多字节
简繁中文 GBK MBCS 多字节
中文、日文及朝鲜语 GB18030 MBCS 多字节
各国语言 unicode,UCS DBCS 宽字节

unicode码在这种背景下诞生了,它统一了全世界的语言符号。使用U+****表示,*为16进制数.spa

  • Unicode不是一次性定义的,而是分区定义。每一个区能够存放65536个(2^16 )字符,称为一个平面(plane)。目前,一共有17个(2^5 )平面,也就是说,整个Unicode字符集的大小如今是2^21。
  • 最前面的65536个字符位,称为基本平面(BMP),它的码点范围是从0 ~ 2^16-1,写成16进制就是U+0000 ~ U+FFFF。全部最多见的字符都放在这个平面,这是Unicode最早定义和公布的一个平面。
  • 剩下的字符都放在辅助平面(缩写SMP),码点范围从U+010000 ~ U+10FFFF

UTF

unicode在实际应用中是有问题的,好比对于多字节字符,如何让机器知道这是一个字符而不是多个字符,因此在与机器实际交互中,须要将unicode转换格式后使用,这就出现了UTF(UTF,是UnicodeTransformationFormat的缩写,意为Unicode转换格式),包括utf-3二、utf-1六、utf-8等等。代理

utf-32

规则:每一个码点使用四个字节表示,字节内容一一对应unicode码点code

unicode 中 'a'为 u+61
utf-32转化后为 00000061
复制代码

缺点:浪费空间。若是一个全是英文的文件,每一个字符都会浪费三个字节的空间,由于每一个英文字符一个字节就能够表示。orm

utf-16

规则:ip

Unicode范围 UTF-16编码方式
U+000~U+FFFF 2 字节存储,编码后等于Unicode值
U+10000~U+10FFFF 4 字节存储。**1.**将Unicode值减去(0x10000),获得20bit长的值。再将Unicode分为高10位和低10位。 UTF-16编码的高位是2 Byte,高10位Unicode范围为0-0x3FF,将Unicode值加上0XD800,获得高位代理(或称为前导代理,存储高位);低位也是2 Byte,低十位Unicode范围同样为0~0x3FF,将Unicode值加上0xDC00,获得低位代理(或称为后尾代理,存储低位)
utf-8

规则:utf-8

  1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。所以对于英语字母,UTF-8 编码和 ASCII 码是相同的。
  2. 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一概设为10。剩下的没有说起的二进制位,所有为这个符号的 Unicode 码。
Unicode符号范围 UTF-8编码方式
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
相关文章
相关标签/搜索