UTF-8 编码
概念
UTF-8 是一种针对 Unicode 的可变长度字符编码,又称万国码。
编码规则
如果只有一个字节则其最高二进制位为 0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为 1 的个数决定了其编码的字节数,其余各字节均以 10 开头。 UTF-8 转换表表示如下:
| Unicode/UCS-4 | bit 数 | UTF-8 | byte 数 | 备注 |
|---|---|---|---|---|
| 0000 ~ 007F | 0~7 | 0XXXXXXX | 1 | |
| 0080 ~ 07FF | 8~11 | 110XXXXX10XXXXXX | 2 | |
| 0800 ~FFFF | 12~16 | 1110XXXX10XXXXXX 10XXXXXX | 3 | 基本定义范围:0~FFFF |
| 1 0000 ~1FFFFF | 17~21 | 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX | 4 | Unicode6.1 定义范围:0~10 FFFF |
| 20 0000 ~ 3FFFFFF | 22~26 | 111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX | 5 | 说明:此非 unicode 编码范围,属于 UCS-4 编码 早期的规范 UTF-8 可以到达 6 字节序列,可以覆盖到 31 位元(通用字符集原来的极限)。尽管如此,2003 年 11 月 UTF-8 被 RFC 3629 重新规范,只能使用原来 Unicode 定义的区域, U+0000 到 U+10FFFF。根据规范,这些字节值将无法出现在合法 UTF-8 序列中 |
| 400 0000 ~ 7FFF FFFF | 27~31 | 1111 110X 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX | 6 | 同上 |
实际表示 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。
笔记来源