ASCII、Unicode和ISO10646

ASCII
  ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits)。ASCII编码可以表示的最大字符数是256个,范围是0~255。八位一般只用低7位(最高位为0),共128个其中包括了控制字符、数字、大小写字母和其他一些符号。而最高位为1的另128个字符被称为“扩展ASCII码”,一般用来存放英文的制表符、部分音标字符等等的一些其他符号。

Unicode字符集
  Unicode标准定义了一个字符集和几种编码。
  Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案,可以只通过一个唯一的数字(Unicode码点)来访问和操作字符。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

ISO 10646
  ISO 10646是一个国际标准编号,该标准的英文全称为:Information Technology – Universal Multiple – Octet Coded Character Set,简称UCS。中文全称为:信息技术–通用多八位编码字符集,亦称大字符集。这一标准为世界各种主要语文的字符(包括繁体及简体的中文字)及附加符号,编订统一的内码。
  ISO 10646标准由国际标准化组织ISO颁布,用来实现全球所有文种的统一编码。ISO 10646与unicode在编码的运作原理相同,从内容上来说是同步一致的。所以它们是互相兼容的。
  根据维基百科全书(http://zh.wikipedia.org/wiki/)的记载:历史上存在两个试图独立设计Unicode的组织,即国际标准化组织(ISO)和一个软件制造商的协会(unicode.org)。ISO开发了ISO 10646项目,Unicode协会开发了Unicode项目。在1991年前后,双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。目前两个项目仍都存在,并独立地公布各自的标准。

UTF编码
UTF= UCS Transformation Format (UCS转换格式),即怎样将Unicode定义的数字转换成程序数据。在Unicode字符编码模型中,编码格式(encoding form)指定如何将每个码点表示为一个或多个编码单元序列。Unicode标准提供了三种不同的编码格式,使用8位、16位和32位编码单元,分别为UTF-8、UTF-16、UTF-32。
(1)UTF-32
  UTF-32是一种最简单的Unicode编码格式。每个Unicode码点被直接表示为一个32位的编码单元。UTF-32是一种固定宽度的字符编码格式。每个UTF-32编码单元的值与Unicode码点的值完全相同。
(2)UTF-16
  在UTF-16中,在范围U+0000到U+FFFF间的码点使用一个单一的16位编码单元表示;而,在范围U+10000到U+10FFFF间的码点则使用一对16位编码单元表示,称作代理对(surrogate pair)。
  UTF-16优化了基本多语言平面(Basic Multilingual Plane)中字符的表示,即位于U+0000到U+FFFF范围内的字符。该范围包含了目前世界上所使用的书写系统中的绝大多数字符,每个字符只需要一个16位的编码单元。对于基本多语言平面,UTF-16可作为固定宽度的编码格式来有效使用。但对于增补字符,UTF-16需要两个16位的编码单元,意味着正式的UTF-16是一个变宽的编码格式。UTF-16是早期Unicode遗留下的历史产物,原本被设计成具有固定宽度的16位编码格式。为支持超过U+FFFF的增补字符,设立了代理机制。
(3)UTF-8
  为满足基于ASCII,面向字节的系统的需要,Unicode标准中定义了第三种编码格式UTF-8。它是一种使用8位编码单元的变宽的编码格式。
  UTF-8编码格式对所有ASCII码点具有透明性。在U+0000到U+007F范围内的Unicode码点,被转换为UTF-8中单一的字节0x00到0x7F,与ASCII码没有区别。并且,从0x00到0x7F不会出现在其他Unicode码点的UTF-8表示中的任一字节中,保证了不存在歧义。
  实际表示ASCII字符的Unicode字符,将会编码成1个字节,并且UTF-8表示与ASCII字符表示是一样的。所有其他的Unicode字符转化成UTF-8将需要至少2个字节。每个字节由一个换码序列开始。第一个字节由唯一的换码序列,由n位1加一位0组成。n位1表示字符编码所需的字节数。

例:
E4 BD A0        11100100 10111101 10100000
这是“你”字的UTF-8编码
4F 60          01001111 01100000
这是“你”的Unicode编码

按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000
把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。
注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。
经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。

以下是Unicode和UTF-8之间的转换关系表:
U-00000000 – U-0000007F: 0xxxxxxx
U-00000080 – U-000007FF: 110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。