6.1 Unicode 字符
在讲 Unicode 字符之前,我们先来简要介绍一下 ASCII 编码。
ASCII 是 American Standard Code for Information Interchange 的缩写,可以翻译为美国信息交换标准代码。它是由美国国家标准学会(American National Standard Institute, 简称 ANSI)制定的标准的单字节字符编码方案,主要用途是基于文本的数据交换。这个方案起始于上个世纪 50 年代的后期,并在 1967 年定案。它最初是美国的国家标准,是不同计算机在相互通信时共同遵守的西文字符编码标准。ASCII 编码支持的所有字符的集合被称为 ASCII 编码集。
ASCII 编码使用 1 个字节来表示 1 个字符。其中的 7 位二进制数字用于表示大写和小写的英文字母、0
到9
的数字、各种英文标点符号,以及一些不可打印字符和控制字符。而字节的最高位则用于奇偶校验。这使得 ASCII 编码集中只能容纳 128 个字符。
我们之前提到的 Unicode 字符实际上指的是 Unicode 编码标准所支持的字符。Unicode 是一个针对书面字符和文本的通用字符编码标准。它定义了多语言文本数据在国际间交换的统一方式,并为全球化软件创建了基础。Unicode 编码标准以 ASCII 编码集作为出发点,并突破了 ASCII 只能对拉丁字母进行编码的限制。它提供了可以对世界上的所有语言中的所有文字进行编码的能力,其支持的字符已超过百万。此外,它还支持所有已知的转义序列和控制代码。
在计算机系统内部,抽象的字符被编码为数字。用于代表抽象字符的整数范围被称为代码空间(code space)。代码空间中的每一个特定整数都被称为代码点(code point)。当一个抽象字符被映射到(或者说被分配给)一个代码点时,这个代码点就可以被看成一个已编码的字符。
在 Unicode 编码标准中,代码空间由从0
到10FFFF
的十六进制整数组成。这就意味着,有 1114112 个代码点可以用于表示抽象字符。Unicode 编码标准的惯用法是使用十六进制形式来表示代码点的数值,并使用U+
作为前缀。比如,英文字母字符'a'
的 Unicode 代码点就是U+0061
。并且,一个受到支持的字符能且仅能由一个对应的 Unicode 代码点表示。
我们已经知道,在计算机系统中,整数可以由固定大小的代码单元(code unit)来表示。比如,8 个比特(也就是 1 个字节)、16 个比特或 32 个比特的代码单元,等等。在 Unicode 编码标准的模型中,编码格式用于确定怎样将代码空间中的每一个整数(或者说代码点)都表示成包含若干个代码单元的序列。Unicode 编码标准中存在多种编码格式。其中有一种编码格式叫做 UTF-8。UTF 是 Unicode Transformation Format 的缩写。
UTF-8 编码格式以单个字节为 1 个代码单元,并且完全兼容 ASCII 编码。换句话说,对于这种编码格式,Unicode 代码点U+000
到U+007F
的编码即为0x00
到0x7f
,并且它们所代表的含义与 ASCII 编码中的完全一致。另外,UTF-8 是一种宽度可变的编码格式。它会根据字符的不同,用 1 至 4 个代码单元来编码一个字符。比如,对于中文、日文和韩文中的一个字符,它会使用 3 个代码单元来表示。也就是说,对于这些 Unicode 字符,UTF-8 会把它们转换成宽度为 3 个字节的二进制数。至于它是怎样转换的,我们就不在此讨论了。
关于 Unicode 编码标准和 UTF-8 编码格式的更多知识,你可以参看 Unicode 官方网站中提供的文档。
总之,Unicode 编码标准帮助我们屏蔽掉了各种字符的复杂性,并且已被普遍认为是解决这一问题的终极标准。而 UTF-8 则是 Julia 所使用的编码格式。Julia 通过此编码格式支持所有的 Unicode 字符。
对于字符和字符串,Julia 通常都会采用 UTF-8 编码格式将它们转换成二进制数并进行存储。