机器只认识1
和0
,因此人为了能用本身的语言与机器交互,规定出了各类二进制与语言字符的对应关系,即编码。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
unicode
在实际应用中是有问题的,好比对于多字节字符,如何让机器知道这是一个字符而不是多个字符,因此在与机器实际交互中,须要将unicode转换格式后使用,这就出现了UTF(UTF,是UnicodeTransformationFormat的缩写,意为Unicode转换格式),包括utf-3二、utf-1六、utf-8等等。代理
规则:每一个码点使用四个字节表示,字节内容一一对应unicode
码点code
unicode 中 'a'为 u+61
utf-32转化后为 00000061
复制代码
缺点:浪费空间。若是一个全是英文的文件,每一个字符都会浪费三个字节的空间,由于每一个英文字符一个字节就能够表示。orm
规则: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
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 |