Unicode
一. 字节和字符:
1) 字节(octet):顾其英文名而思义,就是一个八位的存储单元,取值范围一定是0~255;
2) 字符(character):就是一个语言上的符号,"中"字就是一个字符。字符所占的大小由其编码方式解决,比如"中"在UTF-8中占3个字节(0xE4A8AD),而在GBK中,则占两个字节(0xD6D0)。
二.字符集和编码:
1) 字符集:字符的集合,像Unicode字符集,目标就是收纳了这个世界上所有语言的文字、
2) 符号等; 字符编码:注意,字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一个字符用多个字节表示等问题,则是由编码来决定的。像Unicode字符集的编码方式有很多,诸如UTF-8、UFT-16、UTF-32等。
三.编码方式:
1)中文编码方式:
GB2312:采用2个字节。简体字的编码规范,也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个
GBK:采用了2个字节。GB2312明显收录的汉字不够,于是增加了大量不常用汉字,还加入了几乎所有的Big5中的繁体汉字之后便成了GBK。
GB18030:与前两者不同,采用了变长的编码方式,有1、2、4个字节的编码长度。1个字节编码与ASCII兼容,2个字节编码与GBK兼容,4个字节主要是收录了少数民族的文字等。GB18030诞生的原因类似于GBK,就是增加了大量的汉字,多收录了藏文、蒙文、维吾尔文等主要的少数民族文字。GB18030现在是国家非手持/非嵌入式设备的强制性标准。但是GB18030与前者不同的是,所有的Unicode编码都可以转换为GB18030,而且GB18030除了兼容GBK以及Unicode的BMP部分外,其余的Unicode扩展平面和它的4字节扩展平面都是简单直接的映射
2) UTF-16(采用两个字节存储):
UTF-16BE | 00 41 00 42 00 43 |
UTF-16LE | 41 00 42 00 43 00 |
UTF-16(Big Endian) | FE FF 00 41 00 42 00 43 |
UTF-16(Little Endian) | FF FE 41 00 42 00 43 00 |
UTF-16(不带BOM) | 00 41 00 42 00 43 |
3)UTF-32(采用四个字节存储):
UTF-32BE | 00 00 00 41 00 00 00 42 00 00 00 43 |
UTF-32LE | 41 00 00 00 42 00 00 00 43 00 00 00 |
UTF-32(Big Endian) | 00 00 FE FF 00 00 00 41 00 00 00 42 00 00 00 43 |
UTF-32(Little Endian) | FF FE 00 00 41 00 00 00 42 00 00 00 43 00 00 00 |
UTF-32(不带BOM) | 00 00 00 41 00 00 00 42 00 00 00 43 |
4)UTF-8(采用可变字节存储):
UCS-2(UCS-4) | 第一字节 | 第二字节 | 第三字节 | 第四字节 | 第五字节 | 第六字节 |
U+0000 U+007F | 0xxxxxxx |
|
|
|
|
|
U+0080 .. U+07FF | 110xxxxx | 10xxxxxx |
|
|
|
|
U+0800 .. U+FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx |
|
|
|
U+10000..U+10FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
|
|
00200000-03FFFFFF | 111110xx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
|
04000000-7FFFFFFF | 1111110x | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
因其采用(UCS-4)规范,即四个字节存储,理论上UTF-8可以达到6个字节编码,克服了UTF-16和UTF-32带来的空间浪费.而汉字的unicode范围(4e00-9fa5 即值为19968- 40869),需两个字节存储,所以根据上表得知需占三个字节.如汉字“中”的Unicode码为4E2D --01001110 00101101--UTF-8存储为:
11100100 10111000 10101101