UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。见 UTF-8。
它可以用一至四个字节对 Unicode 字符集中的所有有效编码点进行编码,属于Unicode标准的一部分,由于较小值的编码点一般使用频率较高,直接使用Unicode编码效率低下,大量浪费内存空间。
UTF-8就是为了解决向后兼容ASCII码而设计,Unicode中前128个字符,使用与ASCII码相同的二进制值的单个字节进行编码,而且字面与ASCII码的字面一一对应,这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。
| 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 |
其中:
str.codePointAt(0)
如,山
'山'.codePointAt().toString(16)
得出其十六进制为 0x9053
0x9053
,可知其占用三个字节,确定前缀 1110xxxx 10xxxxxx 10xxxxxx
并根据自身大小进行填充,得到 11101001 10000001 10010011
E9 81 93
在 Javascript 中,可借助于 TextEcoder API
进行转化
export function stringToUint8 (s: string): Uint8Array {
const enc = new TextEncoder()
return enc.encode(s)
}
export function uint8ToString (uint8: Uint8Array): string {
const enc = new TextDecoder()
return enc.decode(uint8)
}
> '山月'.encode()
b'\xe5\xb1\xb1\xe6\x9c\x88'
> b'\xe5\xb1\xb1\xe6\x9c\x88'.decode()
山月