在开始本篇文章之前,我默认大家已经区分好了Unicode编码(也就是代码点)和Unicode编码具体实现之间的区别。要不然,下面讲的你会不知所云的。
历史
我们知道,ISO 10646委员会定义了一个叫做Universal Character Set (UCS)的超级字符集,以囊括世界上所有的书写系统。正因为UCS现在是用4个字节编码,而实现它的则是UTF-16和UTF32之类的方案,正因这些实现方案(注意,非编码方案)是多字节的,所以导致它不兼容US-ASCII相关的系统。UTF-8也因此而诞生。UTF-8的使命之一就是对于ASCII表示的字符,本方案的编码要和ASCII完全一样。
历史上曾经的UTF-8用1~6个字节来编码字符,也就是说,与此对应的抽象代码点可以达到U+7FFFFFFF。但是人们发现,对于代码点来说,根本用不到4个字节编码,只用21位就可以完全包含世界上所有的书写系统了,即合法代码点为0x0000~0x10FFFF。所以随着Unicode规定合法的代码点范围是0x0000 0000 ~0x0010 FFFF,RFC 3629宣布,以前的UTF-8(RFC 2279)标准作废,新标准中UTF-8用1~4个字节来编码字符。
对于Unicode相关的编码,总共有五种:UTF-8, UCS-2, UTF-16, UCS-4 and UTF-32.要是有人非要加上UTF-7那也可以吧。
本系列后续文章会依次讲到上述所有实际编码方案。
UTF-8
UTF-8,顾名思义,是以字节为单位的。并不是说用UTF-8编码的字符就是一个字节,而是说,它是以字节为单位来增加的,1字节,2字节,3字节,4字节。
而UTF-16,则是以16位为单位来增加的,2字节,4字节。
UTF-8和UTF-16都是变长编码的,我们可以通过下面这