从ASCII到Unicode的发展故事
- ASCII是最早的编码方式,由于计算机起源于美国,ASCII只支持英文和数字,以及一些用于程序的控制符
- 等到计算机传播到其它国家时,由于ASCII无法表示其它国家的字符,各国便纷纷推出了自己的字符集。比如中国就推出了包含了汉子字符的GB2312字符集。这些编码的靠前部分,一般都和ASCII是一致的,但后面的部分,不同编码却是不一样的
- 每个国家都使用自己的字符集,这样就很难实现国际化,因为一个国家的字符,到了另外一个国家可能就无法识别,或者被识别为其它的字符。为了统一各国的字符集,于是Unicode便出现了,它包含了所有国家的字符,以满足跨语言、跨平台的需求
- Unicode仅仅是字符集,规定字符对应的数字编号是多少,每个字符占2-4个字节,不包含编码方案。由于这些编号大小不一,较小数值2个字节就可以存储,较大的数值需要4个字节才能存储,如何去存储和识别这些这些字符编码,就构成了不同的编码方案,UTF8,UTF16,UTF32等,都是Unicode的编码方案
常见字符编码简介
- ASCII,美国信息交换标准代码,基于拉丁字母的字符编码系统,一个字符占8位(单字节),总共只有128个字符,只包含字母,数字,常用符号和控制字符。虽然只能表示英文和数字,但是在一些和用户交互较少的领域,比如硬件开发,仍然用得比较频繁,因为这些领域本来就不需要中文,单字节可以节省字节空间,提高运算效率
- Unicode,统一码、万国码,包含了所有语言的字符集,以满足跨语言、跨平台的需求,最多可用32位(4字节)来表示字符
- UTF8,通用字符集传输格式,Unicode的一种编码实现,具体规则看下一节说明
- GB2312,国标码,早期的汉字字符集,属于国家标准,但只包含了常用的汉字字符
- GBK,国标扩展码,在GB2312基础上进一步扩充,包含了所有的汉字字符,但只是一种已被认可的技术规范,尚未被定为国家标准
- BIG5,大五码,繁体中文字符集
- Latin1,ISO-8859-1的别名,西欧字符集,用8位单字节来表示字符,利用了ASCII的首位,因此可以表示更多的字符
- ANSI,国家标准码,各国自制的字符集标准统称ANSI,ANSI不是某一种具体的编码,多用于泛指计算机操作系统所使用的本地字符集
UTF8编码规则
- 对于较短的单字节字符,比如英文字母,字节的第一位存0,后7位存储ASCII码
- 对于多字节字符,如果字符是n字节的,那么第一个字节的前n位设1,第n+1位设0,其它字节开头均设为10,其余空位均用来存储Unicode字符码。比如一个三进制的Unicode字符会表示为:1110xxxx 10xxxxxx 10xxxxxx