首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Unicode 及编码方式概述-2

Unicode 及编码方式概述-2

Unicode                几种常见编码方式Unicode 字符集中的字符可以有多种不同的编码方式,如 UTF-8、UTF-16、UTF-32、压缩转换等。这里的 UTF 是 Unicode                transformation format 的缩写,即统一码转换格式,将 Unicode                编码空间中每个码点和字节序列进行一一映射的算法。下面详细介绍一下这三种常见的 Unicode 编码方式。
UTF-8编码方式
UTF-8 是一种变长的编码方式,一般用 1~4 个字节序列来表示 Unicode 字符,也是目前应用最广泛的一种 Unicode                编码方式,但是它不是最早的 Unicode 编码方式,最早的 Unicode 编码方式是 UTF-16。UTF-8 编码算法有以下特点:
  • 首字节码用来区分采用的编码字节数:如果首字节以 0 开头,表示单字节编码;如果首字节以 110                    开头,表示双字节编码;如果首字节以 1110 开头,表示三字节编码,以此类推;
  • 除了首字节码外,用 10 开头表示多字节编码的后续字节,图 3 列出 UTF-8 用 1~6                    个字节所表示的编码方式和码点范围(实际上 1~4 个字节基本可以覆盖大部分 Unicode 码点);
  • 与 ASCII                    编码方式完全兼容:U+0000 到 U+007F 范围内(十进制为 0~127)的 Unicode 码点值所对应的字符就是                    ASCII 字符集中的字符,用一个字节表示,编码方式和 ASCII 编码一致;
  • 无字节序,在 UFT-8 编码格式的文本中,如果添加了 BOM,则标示该文本是由 UTF-8                    编码方式编码的,而不用来说明字节序。
图 3. UTF-8                    编码方式点击查看大图
在实际的解码过程中:
情况 1:读取到一个字节的首位为 0,表示这是一个单字节编码的 ASCII 字符;
情况 2:读取到一个字节的首位为 1,表示这是一个多字节编码的字符,如继续读到                1,则确定这是首字节,在继续读取直到遇到 0 为止,一共读取了几个 1,就表示在字符为几个字节的编码;
情况 3:当读取到一个字节的首位为 1,紧接着读取到一个 0,则该字节是多字节编码的后续字节。
图 4 概述了 UTF-8                编码方式的特点,其中的"自同步"表示在传输过程中如果有字节序列丢失,并不会造成任何乱码现象,或者存在错误的字节序列也不会影响其他字节的正常读取。例如读取了一个                10xxxxxx                开头的字节,但是找不到首字节,就可以将这个后续字节丢弃,因为它没有意义,但是其他的编码方式,这种情况下就很可能读到一个完全不同或者错误的字符。
图 4. UTF-8                    编码方式UTF-16编码方式
UTF-16 是最早的 Unicode 字符集编码方式,在概述 UTF-16 之前,需要解释一下 USC-2                编码方式,他们有源远流长的关系,UTF-16 源于 UCS-2。UCS-2 将字符编号(同 Unicode                中的码点)直接映射为字符编码,亦即字符编号就是字符编码,中间没有经过特别的编码算法转换。图 5 对 UCS-2 编码方式的概括。
图 5. UCS-2                    编码方式由图 5 可知,UCS-2 编码方式只覆盖基本多语言平面的码点,因为 16 位二进制表示的最大值为 0xFFFF,而对于增补平面中的码点(范围为                0x10000~0x10FFFF,十进制为 65536~1114111),两字节的 16 位二进制是无法表示的。为了解决这个问题,The                Unicode Consortium 提出了通过代理机制来扩展原来的 UCS-2 编码方式,也就是 UTF-16。其编码算法如下:
  • 基本多语言平面(BMP)中有效码点用固定两字节的 16 位代码单元为其编码,其数值等于相应的码点,桶 USC-2 的编码方式;
  • 辅助多语言平面 1-16 中的有效码点采用代理对(surrogate                    pair)对其编码:用两个基本平面中未定义字符的码点合起来为增补平面中的码点编码,基本平面中这些用作"代理"的码点区域就被称之为"代理区(Surrogate                    Zone)",其码点编号范围为 0xD800~0xDFFF(十进制 55296~57343),共 2048                    个码点。代理区的码点又被分为高代理码点和低代理码点,高代理码点的取值范围为 0xD800~0xDBFF,低代理码点的取值范围为                    0xDC00~0xDFFF,高代理码点和低代理码点合起来就是代理对,刚好可以表示增补平面内的所有码点,如图 6 所示。
图 6. UTF-16                    代理对但是在实际的编码过程中通过查表是很麻烦的,图 7 列出了 UTF-16 编码算法是如何对增补平面中的码点进行编码的。
图 7. UTF-16                    编码算法剖析UTF-16 对增补平面中的码点编码还是很负责的,但是由于 UTF-16 是最早的 Unicode 编码方式,已经存在于很多程序中。
返回列表