Unicode的产生原由
- 1960 年美国人发明了 ASCII字符集,这套字符集只支持英语编码,采用单字节字符集
- 随着计算机的在世界的普及其它国家也开始定义自己国家的字符集
- ISO/IEC 8859 字符集拉丁语系国家推出了字符,采用单字节字符集
- GB2312、GBK、GB18030 字符集 简体中文字符集,采用双字节字符集
- ..等等
由于数据的传输及存储都是二进制数据,那么各个国家定义不同的字符集那么同一个字母如果根据不同的编码方式就可能会得到不同的二进制数据,就无法表达它正在的意思。
为了解决这个问题就诞生了 Unicode,最初在设计的时候采用了 16位的 Unicode 字符集,能收录 65536个,后续发现不够用了又对其进行了拓展
从 U+000000 到 U+10FFFF,Unicode 的编码空间可以划分为 17个平面,每个平面包含 个字符一共可以收录 65536 个字符,到目前为止也只使用了其 12% 左右。
这17个平面主要分为BMP平面和辅助平面,BMP平面收录了绝大部分常用字符也就是最初的那65536个字符。辅助平面用以收录其它字符。
UTF编码
Unicode 是字符集: 就是一系列字符,每个字符映射到某一个整数上的一个集合。
UTF 是编码方式: 就是规定了这个字符集以怎样的形式转换成二进制数据存储或者传输。
现目前 Unicode 支持 3种编码方式,UTF-8,UTF-16,UTF-32。
编码方式 | 字节数 |
---|---|
UTF-8 | 1 - 4 |
UTF-16 | 2 or 4 |
UTF-32 | 4 |
之前说了,Unicode 定义一系列字符集合对应了哪些整数,而 UTF 则规定了这些字符是如何转换为二进制传输或者存储的,下面我们就来看看 UTF-8 是如何实现的。
UTF-8实现原理分析
由于采用1-4个字节编码,当我们输入英文的时候就是以1个字节进行编码的,和最初的ASCII一样,其它字符可能采用 n 个字节进行编码,这种方式的好处就是,如果使用英文等单字节字符他的传输和存储字节依然很小,这里其实就把编码方式分为2种了。
- 单字节的字符,保持原有的ASCII字符集编码方式
- 多字节的字符,第一个字节前 n 位为1,第 n + 1 位为 0,后续的一律为 10
x 为后续有效的二进制位数占位符
字节数 | 最小值 | 最大值 | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
---|---|---|---|---|---|---|
1 | 0000 | 007F | 0xxxxxxx | |||
2 | 0080 | 07FF | 110xxxxx | 10xxxxxx | ||
3 | 0800 | FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
4 | 10000 | 1FFFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
举个列:
撸码的‘码’字,对应的 Unicode 为 \u7801,二进制为 1111 000000 00001 根据上表应该采用3个字节进行编码,依次放入对应的 x 占位符多出位高位补 0 得到 UTF-8 编码为 11101111 10000000 10000010,转换为 16 进制为\xEF8082。
网友评论