在开始本篇文章之前,我默认大家已经区分好了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