Unicode编码的作用是将字符和数字对应起来,建立一个一一对应关系的映射关系,但是它并没有对具体怎么使用(例如怎么保存 、怎么传输等)做规定。 例如,Unicode规定了汉字“中”的编码为 Ox4e2d,但是对于具体怎么使用编码Ox4e2d, Unicode没做 规定 。 使用的关键是字符编码以什么形式保存,以及读取的时候如何正确地分割每个字 符 。 我们可以想到的最简单的方式应该就是数组,因为 Unicode 编码扩展后为 21 位,所 以每个数组元素最少就需要 21 位 。 又因为计算机的最小操作单位是字节,所以每个元 素最少应该有 3 个字节,并且需要内存对齐(例如按 2 字节对齐,那么数据的地址就需 要为偶数,当然,这里不对齐也是可以 的,但对齐可以使处理更加简单),所以每个数组元素就需要使用 4 个字节来保存,即 使用 4 个字节( 32 位)来保存一个字符,这样在读取的时候非常方便 。 这种方式就是 UTF-32 编码,但是这种编码太浪费空间,因为 Unicode 编码中的字符最多只有 21 位, 并且常用字符都在 16 位之内,所以使用 32 位来保存一个字符很浪费空间 。 既然常用字 符都在 16位之内,那就使用 16位( 2 个字节)来保存一个字符吧,这就是 UTF-16。 但 是,如果用这种编码方式保存扩展后, 16 位之外的字符就需要比较复杂的转换了, 这还不是主要问题,对于以英文为主的用户来说,这种方式还是有些浪费空间,因为每个英 文字符(包括标点)只需要一个字节(严格来说 7 位)就足够了,而且制定编码规则的人 又正好使用的是英文,所以这种编码方式也不够完美,最后就制定出 UTF-8 编码 。 这也 是现在使用最广的编码方式,它采取了一种弹性的处理方法,将 Unicode 的字符按占用 的空间大小分为 4 种存储方式,
在 UTF-8 编码中,如果字符的 Unicode 编码在 OxOOOOOO ~ Ox00007F,就会直接使 用以 0 开头的一个字节来存储, 如果在 Ox0007F 以上就需要使用多个字节来存储 。 在使用多个字节存储时,除了第一个字节外都是以 10 开头的字节, 而第一个字节是以字节 数量个1开头(例如使用3个字节就是3个1, 4个字节就是4个1),并以0结束作为 标示,。后面存储具体的数值内容 。 也就是说,如果碰到一个字节的第一位是0,那么它 就代表一个单字节的字符,如果碰到一个字节的前两位是10,那么它就是多字节字符中不是首字节的字节,如果碰到一个字节的前两位为 11,那么它就是多字节字符中的首字节,而且第一个 O 前面的 1 的个数就是字符包含的字节数 。 UTF-8 编码中的 4 个字节正 好可以有 21 位来保存内容,因此 Unicode 扩展到 21 位可能和 UTF-8 编码方式有关系 。