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