这个就体现出程序员和普通人对计算机认知的差异了,对程序员来说会觉得字符背后的那个编码才是字符,比如'a'在ASCII里面就是97,'中国'在UTF-8下面就是'xe4xb8xadxe5x9bxbd',而一般人会觉得画在屏幕上那个画才是字符。
在计算机内部处理字符和字符串的过程中,文字几乎始终都是以上面所述的编码的形式存在的,不过编码有多种不同标准,比如GBK和Unicode,处理和解释文字的时候需要知道相应的编码方式,搞混淆了就会出现乱码。在显示的时候,这些编码会被重新转换成对应的文字图形显示出来。早期的时候,当时的显示硬件甚至只支持显示字符,叫做文本模式,程序直接在显存里写入字符编码,显示设备自动将它翻译成对应的字符显示出来,早期DOS一类的命令行操作系统通常都是这样工作的,好处在于非常节约内存和显存。显示字符最初使用的是点阵模式,也就是一个字符变成一个固定大小的像素点的阵列,告诉计算机哪里显示黑哪里显示白,这样就能显示出字来,好处在于实现非常简单对硬件友好,缺点在于不能适配不同大小的文字,但本身在文本模式下,一屏幕显示的字符数量相对来说比较固定,也没法支持文字大小不同。
在Windows这样的图形模式下,显示硬件只处理像素数据,将文字转换成图形是软件完成的,一种仍然是点阵字体的方法,但如果显示很大的字,就会有锯齿出现;另一种方法使用矢量图形显示文字,也就是将字符轮廓用类似于数学中向量的方式表示出来,这样不管字体放多大显示质量都有保证,不会变成锯齿,因为Windows上常用TrueType所以有时候被称为TrueType字体。在现在主流的操作系统中,字体以文件的方式存储在磁盘上,操作系统会根据需要取字体中需要的图形出来绘制到屏幕上,就出现了我们看到的字符图形。
在现代,将文本编码展示为文本图形是极其复杂的过程,远比计算机刚发明时候仅支持ASCII的时代要复杂得多,因为人类有非常丰富的语言语种,同时对文字的排版有非常复杂的要求。比如,某些文字书写时是从右到左书写的,它在渲染到屏幕的时候,字符图形需要从右到左排列;但它还可能被嵌入到一个从左到右的其他语言当中使用(比如我们在中文中插入一个Windows这样的词一样,我们也可以在中文中插入一个从右到左语言的词),同样也可能有从左到右语言插入到从右到左语言之中。另外,因为计算机的字节只有8位,在不同编码方案中并非每个字符的长度都一样,像UTF-8每个字符的字节数就不同,但即便如此,拆分出的每个字符也未必在屏幕上就显示成一个图形——有一些前后的多个字符会组合到一起显示,比如说注音符号、泰文等,还有些时候不同的编码方式会对应到相同的显示符号上。即使是空格的处理,也会分为可以换行的空格、不可以换行的空格、参与两端对齐的空格、不参与两端对齐的空格等等。有些字体中字符的显示会根据前后字符的不同而不同(例如显示成连笔)。再加上文本排版时对于换行和对齐之类的要求,实际上对文本排版是一个极其复杂的问题,需要专门的排版引擎进行,字体的设计也远比前面讨论的复杂。为了全世界不同的人都能友好地使用计算机,专家和软件工程师们可以说没少花心思了。