Unicode详解 真干货! 一文带你手撕Unicode
如果有错误也希望大佬指正!
Unicode 字符集: home.unicode.org/ 可以使用编码工具根据下面的内容自己尝试编码: www.toolhelper.cn/EncodeDecod…
表示方法:
\x表示字节,U+表示码点.
计算机存储字节序列有
大端和小端两种排序方式 (由硬件决定), 分别对应以字节位单位左边为高位和以字节位单位左边为低位举例:0xFFAA在大端模式下存储为\xFF\xAA在小端模式下存储为\xAA\xFF. 在 UTF-8 编码中不存在字节序的问题!
搞明白Unicode的关键在于理解码点和存储内容的关系, 以及计算机具体是如何存储码点的. 码点是 Unicode 定义的标准, 通过码点你能够找到对应的字符, 但计算机并不是直接存储码点的!
UTF-8
UTF-8 是一种动态长度的编码, 占用的空间通常为 1 byte~4 byte, 并且兼容 ASCII 编码.
- UTF-8 的编码规则
- 单字节: 以
0开头 - 双字节: 将码点分成两部分, 以
110开头, 往后的每个字节以10开头 - 三字节: 将码点分成三部分, 以
1110开头, 往后的每个字节以10开头 - 四字节: 将码点分成四部分, 以
11110开头, 往后的每个字节以10开头
- 单字节: 以
下面给出一张表, 以便更直观的理解 UTF-8 的编码规则:
| 字节数 | Unicode码点 | UFT-8编码序列 |
|---|---|---|
| 1 byte | 0aaaaaaa | 0aaaaaaa |
| 2 byte | 0000aaaa aabbbbbb | 110aaaaaa 10bbbbbb |
| 3 byte | aaaabbbb bbcccccc | 1110aaaa 10bbbbbb 10cccccc |
| 4 byte | 000aaabb bbbbcccc ccdddddd | 11110aaa 10bbbbbb 10cccccc 10dddddd |
小练习: 计算出 码点
U+1F601对应的二进制编码序列, 转换成字节序列后在编码工具中解码. 如果没问题的话结果会是一个笑脸的emoji.
UTF-16
UTF-16 也是一种动态长度的编码, 占用的空间通常为 2 byte 或 4 byte.
学习UTF-16之前有几个概念先要了解一下, Unicode 前 65536 个字符被称为基本平面, 这个部分用 2 byte 就足够存储了. 其余的部分称为 辅助平面, 这部分共有 2^20 个字符, 需要 20 bit才够存储, 与UTF-8类似, UTF-16 也是将这20位拆开存储的.
- UTF-16 的编码规则
- 基本平面 (双字节): 直接存储码点, 但是 Unicode 中保留了
U+D800 ~ U+DFFF用于四字节, 这一段不对应任何字符. - 辅助平面 (四字节): 将码点分成两个部分(每个部分10位), 第一个部分以
110110开头, 第二个部分以110111开头. 给出下表以便更直观的理解 UTF-16 的编码规则:
- 基本平面 (双字节): 直接存储码点, 但是 Unicode 中保留了
| 字节数 | Unicode码点 | UTF-16编码序列 |
|---|---|---|
| 2 byte | aaaaaaaa aaaaaaaa | aaaaaaaa aaaaaaaa |
| 4 byte | 0001aaaa aaaaaabb bbbbbbbb | 110110aa aaaaaaaa 110111bb bbbbbbbb |
下面有三点要补充一下:
1. 110110aa aaaaaaaa 换成16进制的范围为 0xD800 ~ 0xDBFF; 110111bb bbbbbbbb 换成16进制的范围为 0xDC00 ~ 0xDFFF.
2. 注意, UTF-16 的表格中码点左边的第 4 位固定是 1. 因为辅助平面需要表示 U+1000 ~ U+10FFFF, 将其转换为二进制会发现左边第三位固定是 1.
3. Unicode 最大的码点是 U+10FFFF, 这也是为什么上面两个表格中最后一行码点的前三位都是 0.
小练习: 计算出 码点
U+1F601对应的二进制编码序列, 转换成字节序列后在编码工具中解码. (注意大小端字节序!)
UTF-32
UTF-32 是一种固定长度的编码, 占用的空间为 4 byte. UTF-32 直接存储码点. UTF-32 同样也存在大小端序列的问题.
小练习: 计算出 码点
U+1F601对应的二进制编码序列, 转换成字节序列后在编码工具中解码. (注意大小端字节序!)
个人精力有限, 只能尽可能的把内容讲的清楚, 肯定多多少少会有一些讲的不到位得到地方, 多多理解~~~