机器只认识1
和0
,所以人为了能用自己的语言与机器交互,规定出了各种二进制与语言字符的对应关系,即编码。
ASCII
编码
最早普及的编码集为ASCII
码,它用一个字节(8位二进制)规定了128个字符的编码(首位二进制统一为0,2^7个),主要都是英文字符。
非ASCII
编码
英语使用ASCII
中规定的128个字符就足够了,但是却远远不足以表示其他语言,即使是利用上首位的二进制,于是出现了各国语言的编码,比如支持简体中文的GB2312
,支持繁体中文的BIG5
。使得在解析文件时还需要注意它的编码格式,否则就会乱码,因为不同的编码对二进制会有不同的解读。
语言 | 字符集 | 正式名称 |
---|---|---|
英语、西欧语 | ASCII,ISO-8859-1 | MBCS 多字节 |
简体中文 | GB2312 | MBCS 多字节 |
繁体中文 | BIG5 | MBCS 多字节 |
简繁中文 | GBK | MBCS 多字节 |
中文、日文及朝鲜语 | GB18030 | MBCS 多字节 |
各国语言 | unicode,UCS | DBCS 宽字节 |
unicode
码在这种背景下诞生了,它统一了全世界的语言符号。使用U+****
表示,*
为16进制数.
- 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-32、utf-16、utf-8等等。
utf-32
规则:每个码点使用四个字节表示,字节内容一一对应unicode
码点
unicode 中 'a'为 u+61
utf-32转化后为 00000061
缺点:浪费空间。如果一个全是英文的文件,每个字符都会浪费三个字节的空间,因为每个英文字符一个字节就可以表示。
utf-16
规则:
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
规则:
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
- 对于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 |
网友评论