字符编码
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(
一个字符的 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 |