UTF-8 编码

概念

UTF-8 是一种针对 Unicode 的可变长度字符编码,又称万国码

编码规则

如果只有一个字节则其最高二进制位为 0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为 1 的个数决定了其编码的字节数,其余各字节均以 10 开头。 UTF-8 转换表表示如下:

Unicode/UCS-4bit 数UTF-8byte 数备注
0000 ~ 007F0~70XXXXXXX1
0080 ~ 07FF8~11110XXXXX10XXXXXX2
0800 ~FFFF12~161110XXXX10XXXXXX 10XXXXXX3基本定义范围:0~FFFF
1 0000 ~1FFFFF17~2111110XXX 10XXXXXX 10XXXXXX 10XXXXXX4Unicode6.1 定义范围:0~10 FFFF
20 0000 ~ 3FFFFFF22~26111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX5说明:此非 unicode 编码范围,属于 UCS-4 编码 早期的规范 UTF-8 可以到达 6 字节序列,可以覆盖到 31 位元(通用字符集原来的极限)。尽管如此,2003 年 11 月 UTF-8 被 RFC 3629 重新规范,只能使用原来 Unicode 定义的区域, U+0000 到 U+10FFFF。根据规范,这些字节值将无法出现在合法 UTF-8 序列中
400 0000 ~ 7FFF FFFF27~311111 110X 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX6同上

实际表示 ASCII 字符的 UNICODE 字符,将会编码成 1 个字节,并且 UTF-8 表示与 ASCII 字符表示是一样的。所有其他的 UNICODE 字符转化成 UTF-8 将需要至少 2 个字节。每个字节由一个换码序列开始。第一个字节由唯一的换码序列,由 n 位连续的 1 加一位 0 组成, 首字节连续的 1 的个数表示字符编码所需的字节数。

Unicode 转换为 UTF-8 时,可以将 Unicode 二进制从低位往高位取出二进制数字,每次取 6 位,如上述的二进制就可以分别取出为如下示例所示的格式,前面按格式填补,不足 8 位用 0 填补。

Unicode 转换为 UTF-8 需要的字节数可以根据这个规则计算:如果 Unicode 小于 0X80(Ascii 字符),则转换后为 1 个字节。否则转换后的字节数为 Unicode 二进制位数+3 再除以 5。

笔记来源