UTF-8编码知识点整理

文章目录

参考资料:

  1. 字符编码笔记:ASCII,Unicode 和 UTF-8 - 阮一峰的网络日志 (ruanyifeng.com)
  2. List of Unicode characters - Wikipedia

相关概念

  • 字符:是对文字和符号的总称,例如汉字、拉丁字母、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表示英语的大写字母AU+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编码规则简述:

  1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的 (这个实际上对应Unicode码在127(01111111)以内的字符)
  2. 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码
Unicode码范围(十六进制)Unicode码有效位UTF-8编码方式
0000 0000-0000 007F0 - 70xxxxxxx
0000 0080-0000 07FF8 - 11110xxxxx 10xxxxxx
0000 0800-0000 FFFF12 - 171110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF18 - 2111110xxx 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。