UTF-8编码知识点整理
文章目录
参考资料:
相关概念
- 字符:是对文字和符号的总称,例如汉字、拉丁字母、emoji 都是字符
- Unicode码点(Code Point):在Unicode字符集中,每个字符都对应一个唯一数,这个唯一数就是Unicode码点。码点范围:U+0000 - U+10FFFF(十六进制)。这个范围可以容纳超过100万个字符
- 字符平面(Plane):将字符进行分组,每组容纳65536(2^16)个字符,每一组称为一个平面,一共划分了17个平面
- UTF:Unicode Transformation Format。字面意思就是Unicode转换格式,就是对Unicode码做格式转换(编码)
- BOM:Byte Order Mark,字节标记顺序,位于文件开始的地方,用于标记高位在前还是低位在前。对于UTF-8而言,其BOM为EF BB BF。通常来说:Windows系统里的UTF-8编码的文件都带有BOM,而类Unix系统则不带。
Unicode和UTF的关系
Unicode是一个字符集合,将二进制编码映射为字符或者符号。每个符号的编码都不一样,比如,U+0639
表示阿拉伯字母Ain
(ع
),U+0041
表示英语的大写字母A
,U+4E25
表示汉字严
。Unicode字符集只是规定了字符对应的二进制编码,但是没有规定二进制编码如何存储。
UTF是Unicode的实现方式,即规定了字符的二进制编码的存储方式(将字符对应的Unicode码编按照一定的规则编排成二进制(字节)形式来来存储。不同的UTF编码方式使用几个字节存储,以及每个字节的含义均不同)。
有UTF-8,UTF-16和UTF-32这几种不同的实现方式。
- UTF-8:变长编码方式,使用1~4个字节表示一个符号
- UTF-16:变长编码方式,使用2个或者4个字节表示
- UTF-32:使用4个字节表示
UTF-8
UTF-8编码规则简述:
- 对于单字节的符号,字节的第一位设为
0
,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的 (这个实际上对应Unicode码在127(01111111)以内的字符) - 对于n字节的符号(n > 1),第一个字节的前
n
位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码
Unicode码范围(十六进制) | Unicode码有效位 | UTF-8编码方式 |
---|---|---|
0000 0000-0000 007F | 0 - 7 | 0xxxxxxx |
0000 0080-0000 07FF | 8 - 11 | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 12 - 17 | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 18 - 21 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
下面,还是以汉字严为例,演示如何实现 UTF-8 编码。
严的 Unicode 码是4E25(100 1110 0010 0101),有效位是15位,根据上表,可以发现4E25处在第三行的范围内(0000 0800 - 0000 FFFF),因此严的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从严的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,严的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5。