前言
如果要处理文本,Unicode 是一定要使用的,但是由于各种各样复杂的原因,导致 Unicode 的学习和使用是一件相当复杂的事情。
不过,无论如何,通过搜集资料,我还是在这里对了解到的 Unicode 的知识,做一个小小的总结。
历史
首先,计算机是不能直接处理文本的,计算机只和数字打交道。为了在计算机里用数字表示文本,需要指定一个从字符到数字的映射。这个映射,被称为编码
一开始,最有名的编码字符集是 ASCII 码。ASCII 码是 7 位的,它将英文字母,数字 0-9 以及一些标点符号和控制字符映射为 0-127 这些整型。
当然,ASCII 码显然是不够用的,于是开始出现了各种各种各样的编码字符集,并且互相不兼容,而同时在同一个文档里使用多种字符编码集是不可能的,这也造成了当时多种编码字符集混战的局面。
幸好, Unicode 出现了。
Unicode
Unicode 标准为世界上几乎所有的书写系统里所使用的每一个字符或符号定义了一个唯一的数字,这个数字是21位的。
这个数字,被称为码点(code point), 以 U+xxxx
这样的格式写成,格式里的 xxxx
代表四到六个十六进制的数。
简单点来说,Unicode 是一个庞大的字符集,里面拥有世界上几乎所有的字符,并为它们提供了唯一的映射。
可能看上这个定义也没那么难理解,但要想实现这个庞大的字符集的编码系统,并兼容很多的历史包袱,是一件相当相当复杂的事,这也不是我的一篇文章能够讲明白的,这里仅仅只是简单地概括了一下。
Unicode 转换格式
Unicode 还需要定义另一种编码来确定码点在内存和硬盘中要如何表示。Unicode 标准为此定义了几种映射,叫做「Unicode 转换格式」(Unicode Transformation Formats,简称 UTF)。日常工作中,人们就直接把它们叫做「编码」—— 因为按照定义,如果是用 UTF 编码的,那么就要使用 Unicode,所以也就没必要明确区分这两个步骤了。
其中最常用的应该是 UTF-8 。
UTF-8,是一套以8位为一个码元(code unit)的可变长的编码规则。
可能很多人要问,为什么要进行「Unicode 转换格式」这一步呢,难道直接存储码位本身不好吗?
原因大概如下:
一定程度的压缩,节省内存空间
规范存储方式,避免不必要的麻烦