Manpages

NAME

UTF-8 - ASCII 兼 容 的 多 字 节 Unicode 编 码

描 述

The Unicode 字 符 集 使 用 的 是 16 位 ( 双 字 节 ) 码 。 最 普 遍 的 Unicode 编 码 方 法 ( UCS-2) 由 一 个 16 位 双 字 序 列 组 成 。 这 样 的 字 符 串 中 包 括 了 的 一 些 如 ’\0’或 ’/’这 样 的 在 文 件 名 中 或 者 是 在 C 库 函 数 中 具 有 特 殊 意 义 的 字 符 。 另 外 , 如 果 没 有 做 重 大 的 修 正 的 话 , 大 部 分 操 作 ASCII 码 文 件 的 UNIX 工 具 不 能 够 正 确 识 别 16 位 的 字 符 。 因 此 , UCS-2 对 于 Unicode 的 文 件 名 、 文 本 文 件 、 环 境 变 量 等 等 来 说 并 不 是 一 种 合 适 的 外 部 编 码 方 式 。 ISO 10646 Universal Character Set (UCS), 是 Unicode 的 超 集 , 甚 至 使 用 了 31 位 编 码 方 式 , 另 外 还 有 使 用 32 编 码 的 UCS-4 也 有 同 样 上 述 的 问 题 。 UCS-4 而 用 UTF-8Unicode UCS 编 码 就 不 会 存 在 这 样 的 问 题 。 所 以 , UTF-8 很 明 显 的 是 在 UNIX 类 操 作 系 统 下 的 Unicode 字 符 集 的 解 决 方 案 。

属 性

UTF-8 编 码 具 有 以 下 优 良 属 性 :

*

UCS 字 符 从 0x00000000 到 0x0000007f ( 传 统 的 US-ASCII 字 符 ) 简 单 地 编 码 为 字 节 0x00 到 0x7f ( 与 ASCII 码 兼 容 ) 。 这 意 味 着 只 包 含 7 位 ASCII 字 符 的 文 件 和 字 符 串 在 ASCIIUTF-8. 编 码 方 式 下 是 完 全 一 样 的 。

*

所 有 大 于 0x7f 的 UCS 字 符 被 编 码 成 为 多 字 节 序 列 。 该 序 列 全 部 是 由 0x80 到 0fd 的 字 符 组 成 , 这 样 就 不 会 有 标 准 ASCII 字 符 会 被 作 为 某 个 字 的 一 个 部 分 这 种 现 象 出 现 , 对 于 ’\0’和 ’\[u2019]这 样 的 特 殊 字 符 来 说 也 就 不 会 有 问 题 了 。

*

保 留 了 UCS-4 字 典 中 的 字 节 串 的 排 列 顺 序 。
* 所 有 2^32 次 方 的 UCS 码 都 能 够 使 用 UTF-8 来 进 行 编 码 。
*

0xfe 和 0xff 两 个 字 符 在 UTF-8 中 不 会 被 用 到 。

* 表 示 非

ASCII 码 的 UCS 多 字 节 串 的 开 始 字 符 总 是 0xc0 到 0xfd 之 间 的 字

符 , 并 会 指 出 该 串 的 长 度 。 多 字 节 串 的 其 他 字 符 都 是 0x80 到 0xbf 之 间 的 字 符 。 这 使 得 再 同 步 非 常 简 单 , 并 令 编 码 是 无 态 的 , 丢 字 节 现 象 也 不 容 易 发 生 。

* 用

UTF-8 编 码 的 UCS 字 符 可 以 增 加 到 6 个 字 节 的 长 度 。 而 Unicode 只 能 增

加 到 3 个 字 节 长 。 由 于 Linux 只 使 用 16 位 的 UnicodeUCS 的 子 集 。 所 以 在 Linux 下 , UTF-8 多 字 节 串 长 度 最 多 不 会 超 过 三 个 字 节 。

编 码 方 式

下 面 的 字 节 串 用 来 表 示 一 个 字 符 。 用 什 么 串 依 照 该 字 符 在 UCS 编 码 中 的 序 号 来 定 :

0x00000000 - 0x0000007F:

0xxxxxxx

0x00000080 - 0x000007FF:

110xxxxx 10xxxxxx

0x00000800 - 0x0000FFFF:

1110xxxx 10xxxxxx 10xxxxxx

0x00010000 - 0x001FFFFF:

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

0x00200000 - 0x03FFFFFF:

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

0x04000000 - 0x7FFFFFFF:

1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 这 里 xxx 的 位 置 二 进 制 位 形 式 的 字 符 编 码 填 入 。 只 用 最 短 的 那 个 足 够 表 达 一 个 字 符 编 码 数 的 多 字 节 串 。

举 例 说 明

Unicode 字 符 0xa9 = 1010 1001 (版 权 所 有 的 符 号 ) 在 UTF-8 中 被 编 码 为 :

11000010 10101001 = 0xc2 0xa9 字 符 0x2260 = 0010 0010 0110 0000 (“不 等 于 ”符 号 )被 编 码 为 :

11100010 10001001 10100000 = 0xe2 0x89 0xa0

遵 循 标 准

ISO 10646, Unicode 1.1, XPG4, Plan 9.

作 者

Markus Kuhn

参 考

unicode(7)

[中 文 版 维 护 人 ]

billpan <billpan [AT] yeah.net>

[中 文 版 最 新 更 新 ]

2000/11/09

《 中 国 linux论 坛 man手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh