字符的机器级表示

字符

大多数计算机中的数据指令都是二进制位形式的。注意这里区分一下二进制位和二进制数,二进制数是数学概念,而机器本身是“无法理解”数学概念的,只能按照人类规定的范式处理二进制位。只有人类规定好相关范式,计算机才能把二进制位当作数来处理。之后可能不去区分二进制位和二进制数的概念。

想要让计算机存储和表示字符,需要用公认和权威的标准,建立其与二进制位的映射关系,否则计算机间很难交互。这种映射称为字符编码。其由国际机构或国家机构制定。可分为如下2部分:

1) 字符集:规定了语言包含的所有字符和标点符号等。但语言是比较复杂的,比方说让大陆、香港、台湾、日本出具一份汉字的字符集,那它们可能出的不一样。所以汉语这“一种语言”就有国际、大陆、台湾等的多个版本的字符集;

2) 编码:编码是指给定字符集中的字符的区分和表示的方案,对于非计算机有莫尔斯电码的方案,计算机则通常用定长或变长的二进制数来做编码。考虑到二进制数表示字符常需要较多的位,以及机器中数据的位数常以字节为倍数,在很多时候又会用十六进制来表示二进制的编码;

 

ASCII方案

做为美国标准的ASCII,由于英文字符量少所以同时包括了字符集和编码。这些码是从0开始的连续整数,最高不超过1111111,通常用定长的8位二进制存储,下面是其具体组成:

1) 十进制编码0~31:包括控制字符通信字符,控制符中包括“主板响铃”、“回车”、“打印机换页”、“换行”、“退格”等等,而通信符中包括“确认ACK”、“文头SOH”等等;

2) 十进制编码32~126:文字字符部分,即大小写字母、数字、英文标点等等;

新的计算机和内存的数据单位是字节(8位),故人们想利用剩下的最后1位,有2种普遍用法:

1) 扩展ASCII:这1位可以让ASCII的数量翻倍,不同的厂商可能会将其用来表示自己的东西,比如Apple的logo等等。这种“私人标准”通常只在同厂商设备中能一致的识别;

2) 校验码:考虑数据传输可能出错,这1位常存放奇偶校验码,可判断1位内的错误;

 

Unicode方案

由于ASCII只有英文,所以后来适用全球的Unicode,该方案既可看作字符集也可看作和ASCII类似的“字符集+编码”方案,因为其指明了字符的编号方式,但没有明确其机器级二进制表示(注意数学上的二进制数和机器级二进制表示是不一样的,比如二进制数就没有定长的概念)。故Unicode有多种二进制方案,主要为UTF系列编码,这样的编码才能算是完整的“字符集+编码”方案。

指定全球标准非常麻烦,语言间的差异有时难以想象。比如有的语言中,同样的字符可能因为上下文环境不同,有3种不同的写法。这里举几个Unicode在发展中遇到的问题:

1) 编码中有个问题是编码应当记录字典序信息,比如说英文公认的字典序是c在d前,所以c的Unicode数字小于d。不过Unicode对中文的中文字典序是康熙字典的偏旁部首序,但中国人最常用拼音序

2) 日语是包含部分“汉语”的,并且日本有官方的5万字汉字字典。收录日本汉字会导致Unicode放不下,故Unicode定义了CJK(中日韩统一表意文字),把它们当1种语言来共用码点。这让部分人不爽;

3) 时代发展带来新词,这在英语中只需组合字母,在中文中只需组合汉字。不过这在日语中需要造字,这导致Unicode需要不时的更新标准,收录新的字符;

Unicode在后期为了扩容,使用称为辅助平面(plane)的字符集分组方案。其包含17个平面,每个平面至多包含\(2^{16}\)个字符,所有平面可容纳\(2^{21}\)个字符。其中第0个平面称为基本平面,用于放置扩容前的字符。第1辅助平面存放“中日韩字符补充”等内容,目前大多平面都未启用。

 

UTF系列方案

UTF全称Unicode Transformation Format,即Unicode转换格式。下面看3种UTF编码:

1) UTF-32:一种32位的定长编码,32位说明其包括基本面和其他辅助面的字符。其特点是跟Unicode的映射关系简单,但非常浪费空间,对于’a’都需要32位空间,所以不常用;

2) UTF-16:一种变长编码,其有16位与32位这2种长度。其中16位的是基本面字符,32位的是其他辅助面字符。那么在用传输UTF-16编码的多个字符时,每个编码都是紧挨着的,计算机怎么知道应该按16还是32位截取呢?这就需要看UTF-16的具体编码了,在Unicode基本面中0xd800-0xdfff是空的,而16位UTF-16编码完全和Unicode基本面一样,故其在该范围也是空的。而对于32位UTF-16编码,其会把0xd800-0xdfff作为前16位。这样计算机可以按16位为单位读取,当读取到这个范围内的数就知道还要再读16位,把这32位作为1个字符。Windows中曾直接把UTF-16编码称为Unicode编码;

3) UTF-8:一种变长编码,其允许更多的长度。其中最短的是8位UTF-8,这8位完全等于ASCII码(第1位等于0)。并且其采用了和UTF-16相同的方便计算机区分不同长度的UTF-8的方法,比如对于8位以外的UTF-8编码,其第一位都固定为1;

这些编码方案不一定等于Unicode全集。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部