utf8 是 ISO 10646 的一种转换格式。被定义在 rfc3629 中。

ISO/IEC 10646 定义了一组名为 Universal Character Set(UCS) 的字符集。Unicode standard(UNICODE) 也定义了一组相同的字符集。两个规范的委员有意将它们保持一致。

ISO/IEC 10646 和 Unicode 定义了一组字符集:UTF-8, UCS-2, UTF-16, UCS-4 和 UTF-32。在编码形式上,每个字符由多个 encoding unit 构成。除了 UTF-8 外的其他编码的编码单元都大于一字节,因此很难与现有(使用 ASCII 编码的)系统集成。

UTF-8 是变长编码。编码形式具有以下特征:

  • U+0000 - U+007F 对应了 ASCII 编码形式(7bit)。因此有效的 ASCII 字符串也是有效的 UTF-8 字符串。

  • ASCII 不会出现在 UTF-8 编码的字符流中。因此提供了向后兼容性。

  • 多字节字符的第一个字节表示了它的宽度。

  • C0, C1, F5 和 FF 值永远不会出现。

  • 字符边界很容易在字符流中被找到。

  • Boyer-Moore 快速搜索算法对于 UTF-8 有效。

  • UTF-8 字符串很容易辨别。因为其他编码在 UTF-8 中出现的概率很低,这一概率随着字符串的长度增长而降低。

UTF-8 定义

UTF-8 由 Unicode 标准定义。

在 UTF-8 编码中,来自 U+0000 至 U+10FFFF 范围内的字符(即 UTF-16 可访问的范围)使用 1 到 4 个字节(octets)的序列进行编码。对于由单个字节组成的“序列”,其最高位被设置为 0,剩下的 7 位用于编码字符数值。在一个由 n 个字节组成的序列中,n > 1,第一个字节的前 n 位高位被设置为 1,紧接着的一位被设置为 0。该字节中剩余的位则存储待编码字符的数值信息。随后的字节(如果有)都将最高位设置为 1,紧随其后的位设置为 0,这样每个字节中留下 6 位来存储待编码字符的信息。

下面的表格总结了格式:

字符UTF-8 字节序列

0000 0000-0000 007F

0xxxxxxx

0000 0080-0000 07FF

110xxxxx 10xxxxxx

0000 0800-0000 FFFF

1110xxxx 10xxxxxx 10xxxxxx

0001 0000-0010 FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8 字节流表达式

UTF8-octets = *( UTF8-char )
UTF8-char   = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
UTF8-1      = %x00-7F
UTF8-2      = %xC2-DF UTF8-tail
UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
              %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
              %xF4 %x80-8F 2( UTF8-tail )
UTF8-tail   = %x80-BF
Last moify: 2022-12-04 15:11:33
Build time:2025-07-18 09:41:42
Powered By asphinx