Unicode
首先说为什么要有 Unicode 以及 Unicode 具体是什么。
计算机发展早期,使用的是 ASCII 编码,这个我们很熟悉,长度为一个字节,可以表示 256 种情况。但是很快,随着计算机的发展,这种编码显然是不够用的,各国的文字、各种 emoji等等,ASCII 根本无法装下,于是就有了 Unicode。
Unicode 是一种规范,并不是一种具体的编码实现方式。Unicode 是“字符集标准”(定义所有字符的编号),它只做两件事情:
-
定义全世界所有的字符
-
给每个字符分配一个唯一的码点
例如:
-
A 的码点是 U+0041
-
中 的码点是 U+4E2D
-
😀 的码点是 U+1F600
Unicode 并不关心“如何存储这个字符”,它只定义字符和码点之间的关系。
可以把 Unicode 想象成一份字典,只规定 :字符 = 整数编号。
UTF-8
前面提到,Unicode 实际上是一个标准,并不关心具体的实现,那么具体如何实现,就是 UTF-8 做的事情了,UTF-8 是一种实现 Unicode 的编码方式。
它的职责是:把 Unicode 码点转换成字节序列。
除了 UTF-8,实际上还有 UTF-16、UTF-32等等,它们都属于 Unicode 编码方案。
UTF-8的特点是:
-
可变长度编码(1 到 4 字节)
-
ASCII 范围 0x00–0x7F 只占 1 字节,与 ASCII 完全兼容
-
中文这种高码点字符会占 3 字节,例如 中 (U+4E2D) 编码为 E4 B8 AD
最后一句话总结 Unicode 与 UTF-8的关系:假如 Unicode 是全国公民身份证号系统,每个人都有唯一编号,那么 UTF-8 则像是身份证的打印规则,需要设计编号怎么编码成身份证号这种格式。