这也有几方面的原因,比如说除开英文,其他大部分的文字都需要用 2 个甚至更多的字节来表示;如果统一都用 Unicode 来表示,那必然需要以占用字节最多的字符长度为标准。
比如汉字需要 2 个字节来表示,而英文只需要一个字节;这时就得规定 2 个字节表示一个字符,不然汉字就没法表示了。
但这样也会带来一个问题:用两个字节表示英文会使得第一个字节完全是浪费的,如果一段信息全是英文那对内存的浪费是巨大的。
这时大家应该都能想到,我们需要一个可变的长度的字符编码规则,当是英文时我们就用一个字节表示,甚至可以完全兼容 ASCII 码。
UTF-8 便是实现这个需求的,它利用两种规则可以表示一个字节以及多字节的字符。
大致规则如下:
当第一个字节的第一位为 0 时便表示为单字节字符,此时和 ASCII 码一致,完全兼容。
当第一个字节为 1 时,有几个 1 便代表是几个字节 Unicode 字符。
这样便可根据字符的长度最大程度的节省存储空间。
当然还有其他的编码规则,比如 UTF-16、UTF-32,平时用的不多,但本质上都和 UTF-8 一样,都是 Unicode 的不同实现,也是用于表示世界上大部分文字的字符集。
Java 中的 emoji现在来回到本次的主题,emoji。
刚才说到 Unicode 包含了世界上大部分的字符,emoji 自然也不例外。
https://apps.timwhitlock.info/emoji/tables/unicode
这个表格中包含了所有的 emoji 以及它所对应的 Unicode 编码,同时也有对应的 UTF-8 编码的实现。
从图中也可以看出 emoji 表情用 UTF-8 表示时会占用 4 个字节,那在 Java 中它会是怎么存储的呢?
很简单,debug 一下就知道了。
在 Java 中也是通过 char 来存储 emoji 的,char 作为基本数据类型会占用 2 个字节;从刚才的图中可以看出,emoji 使用 UTF-8 会占用四个字节,这样很明显 char 是没法存储的,所以在这里其实是使用 UTF-16 编码进行存储。
基于这个原理,我们也可以自己实现将一个 emoji 表情转换为字符串,同时也可通过字符串转换为 emoji。
总结从这次研究 emoji 可以看出,任何一门基础知识都是应用的根基,在计算机行业尤为突出,希望大家看完这篇能回忆起大学课堂被老师支配的恐惧