UTF-8 小解
UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode 的可变长度字符编码,也是一种前缀码。见 UTF-8。
它可以用一至四个字节对 Unicode 字符集中的所有有效编码点进行编码,属于 Unicode 标准的一部分。由于较小值的编码点一般使用频率较高,直接使用 Unicode 编码效率低下,大量浪费内存空间。
UTF-8 为了解决向后兼容 ASCII 而设计,Unicode 中前 128 个字符使用与 ASCII 相同的二进制值的单个字节进行编码,且字面与 ASCII 一一对应,使得原来处理 ASCII 字符的软件无须或只须做少部分修改即可继续使用。
UTF8 Code Point Prefix
| Number of bytes | Bits for code point | First code point | Last code point | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
|---|---|---|---|---|---|---|---|
| 1 | 7 | U+0000 | U+007F | 0xxxxxxx | |||
| 2 | 11 | U+0080 | U+07FF | 110xxxxx | 10xxxxxx | ||
| 3 | 16 | U+0800 | U+FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
| 4 | 21 | U+10000 | U+10FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
其中:128 个 ASCII 字符只需一个字节;带附加符号的拉丁文、希腊文等需两个字节;基本平面(BMP)中的大部分常用字(如大部分汉字)使用三个字节;辅助平面的字符(如 emoji)使用四字节。
转化过程
- 将数据转化为 unicode 的 codePoint(如
str.codePointAt(0)) - 根据前缀表确定所占用的字节数
- 根据字节数确定前缀,将 codePoint 转化为二进制从右填充
- 将每八个二进制计算得出 UTF-8 编码
例如「山」:codePoint 0x9053,占三字节,前缀 1110xxxx 10xxxxxx 10xxxxxx,填充得 11101001 10000001 10010011,即 E9 81 93。