1. Introduction (简介)
ISO/IEC 10646 [ISO.10646] 定义了一个称为通用字符集 (Universal Character Set, UCS) 的大型字符集,涵盖了世界上大多数书写系统。相同的字符集也由Unicode标准 [UNICODE] 定义,后者进一步定义了额外的字符属性和其他对实现者非常有用的应用细节。到目前为止,Unicode的变化以及ISO/IEC 10646的修订和补充一直相互跟踪,因此字符集和码点分配保持同步。相关的标准化委员会已承诺维护这种非常有用的同步性。
编码形式 (Encoding Forms)
ISO/IEC 10646和Unicode定义了其共同字符集的几种编码形式:
- UTF-8
- UCS-2
- UTF-16
- UCS-4
- UTF-32
在编码形式中,每个字符都表示为一个或多个编码单元。除UTF-8外,所有标准UCS编码形式的编码单元都大于一个八位字节,这使得它们在许多假定8位甚至7位字符的当前应用程序和协议中难以使用。
UTF-8的特点
UTF-8是本备忘录的主题,它具有一个八位字节的编码单元。它使用八位字节的所有位,但具有保留完整US-ASCII [US-ASCII] 范围的特性:
- US-ASCII字符以一个八位字节编码,其值为正常的US-ASCII值
- 任何具有此类值的八位字节只能代表一个US-ASCII字符,而不能代表其他内容
UTF-8编码特性
UTF-8将UCS字符编码为可变数量的八位字节,其中八位字节的数量和每个八位字节的值取决于ISO/IEC 10646中分配给字符的整数值(字符编号,也称为码位 (code position)、码点 (code point) 或Unicode标量值 (Unicode scalar value))。
这种编码形式具有以下特性(所有值均为十六进制):
✅ ASCII兼容性
字符编号从U+0000到U+007F(US-ASCII字符集)对应于八位字节00到7F(7位US-ASCII值)。直接结果是,纯ASCII字符串也是有效的UTF-8字符串。
✅ 无ASCII混淆
US-ASCII八位字节值不会以其他方式出现在UTF-8编码的字符流中。这提供了与文件系统或其他软件(例如,C库中的printf()函数)的兼容性,这些软件基于US-ASCII值进行解析,但对其他值透明。
✅ 易于转换
UTF-8与其他编码形式之间的往返转换很容易。
✅ 序列长度指示
多八位字节序列的第一个八位字节指示序列中的八位字节数。
✅ 受限的字节值
八位字节值C0、C1、F5到FF永远不会出现。
✅ 字符边界识别
可以从八位字节流中的任何位置轻松找到字符边界。
✅ 排序保持
UTF-8字符串的字节值字典排序顺序与按字符编号排序相同。当然,这只有有限的意义,因为基于字符编号的排序顺序几乎从不符合文化习惯。
✅ 快速搜索算法
Boyer-Moore快速搜索算法可以与UTF-8数据一起使用。
✅ 可识别性
UTF-8字符串可以通过简单的算法相当可靠地被识别出来,也就是说,任何其他编码的字符串作为有效UTF-8出现的概率很低,并且随着字符串长度的增加而降低。
UTF-8的历史
UTF-8由Ken Thompson于1992年9月设计,由Rob Pike指定的设计标准指导,目标是定义一种可以在Plan9操作系统中以非破坏性方式使用的UCS转换格式。Thompson的设计通过X/Open联合国际化小组XOJIG(参见 [FSS_UTF])进行标准化,在此过程中使用了FSS-UTF(变体FSS/UTF)、UTF-2,最终命名为UTF-8。