跳转至

字符编码

Unicode 编码与 UTF-8 编码均是由 Unicode 协会( The Unicode Consortium)制定的对各国文字、符号进行统一编码的编码体系。

unicode 编码

为了方便全球范围内的数据交换,Unicode 协会最先推出了Unicode 编码,它采用 两个字节 来表示一个字符,是一种 16 位编码方式。这种编码方式不可避免地存在兼容性问题:目前网络设备和协议都是针对 字节 进行处理,当网络设备接收到一个Unicode 时,会自动将其切分为两个字节,并检查其中是否含有控制码,这将会使 Unicode 数据变得残缺不全,造成数据损失。

utf8编码

utf8背景

为了解决上述 Unicode 编码兼容性这一问题,Unicode 协会又制定了 UTF-8 编码,它 采用 变长的多字节串 来表示字符,可以说是 Unicode 的 8 位编码方式。由于这两种编码方式同时存在,而且都有着广泛的应用,在对信息进行处理时,我们经常需要将这两种编码相互转换。

utf8编码原则

在 UTF-8 编码中,所有的字符均使用 1 到 6 个字节进行编码。在只包含 1 个字节的 UTF-8 编码中,其最高位置为 0,其余的 7 个二进制位用来对字符进行编码;在含 n( \(1 < n \leq 6\))个字节的 UTF-8 编码中,其第一个字节的前 n 位赋值为 1,第 n+1 位赋值为 0,该字节剩余的其它二进制位用来对字符进行编码,后续字节的最高位均赋值为 1,次高位均赋值为 0,每个字节中剩余的 6 个二进制位用来对字符进行编码。

一个字符的 UTF-8 编码中包含字节个数的多少是由其 Unicode 编码所处的范围来决定的,具体如表 1 所示,该表中给出了不同范围内的 Unicode 字符对应的 UTF-8 编码的格式,其中已填入的 1、0 数据表示约定的标记位,x 表示对字符编码时可用的二进制位。将 Unicode 编码的二进制位按由低到高的次序放入 x 表示的空位中即可得到其所对应的UTF-8 编码。

UTF-8 字节数目 Unicode 编码(十六进制) UTF-8 编码(二进制)
1 U+0000 0000 - U+0000 007F 0xxxxxxx
2 U+0000 0080 - U+0000 07FF 110xxxxx 10xxxxxx
3 U+0000 0800 - U+0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
4 U+0001 0000 - U+001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5 U+0020 0000 - U+03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 U+0400 0000 - U+7FFF FFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

中文汉字编码