始于ASCII
从二进制的01数字世界到文本的第一步是编码,ASCII出色完成这个任务。早期计算机起源于美国,用8位二进制数,0-127去对应出128个字符,在英语世界已经绰绰有余,甚至用不完,剩下一个最高校验位0。不得不说英语这种要少量字符拼字的语言确实符合计算机的工作方式。
其他国家的人也需要使用计算机,只表示英语似乎不太够用。使用其他语言的人,在ASCII的基础上制作的各种新的编码,来让计算机能识别自己用的语言。
ASCII扩展集
首先加入战场的欧洲人,他们发现老美太浪费了:ASCII码,8个比特都不吃干净,留一个校验位干嘛?那丢掉的可不是一个比特,是从128到256整整一倍的容量!所以欧洲各种纷纷把这一位利用起来,从128-255这些数字被加进来对应于各种西欧字符。但具体对应什么,得看标准和语言。比如:
- ISO/IEC 8859-1(Latin-1):用于西欧语言,包含拉丁字母
- ISO/IEC 8859-2(Latin-2):用于中欧语言,如波兰语、捷克语
觉得ASCII浪费的显然不知欧洲人,老美自己也觉得不合适,许多美国科技公司也制作了扩展集:
- Windows-1252 微软在Windows中使用
- Mac OS Roman 苹果在Mactonish使用
ASCII扩展主要是为例支持欧洲语言。因为支持拉丁语系的表示简单的优势,支持它们并不困难,编码它们用的也还是ASCII那一套。
汉字编码
一个数对应一个字符,简单的原理对于包括汉字在内的亚洲字符而言实在过于困难。汉字是独立的,每个都不一样,虽然可以拆解为基础元素笔画偏旁等,但其中组合方式过于方法,让电路板去理解汉字无异于教牛弹琴。一一对应吧,大力出奇迹,无非是多来点字节。
1980年GB2312,中国发布了首个汉字编码国家标准GB2312,GB即国标。国标码主要采用双字节编码,包含6763个汉字和682个符号,覆盖了常用的简体汉字,从此计算机识字了。
六千个字虽然够用,但在中华文化面前确是九牛一毛,何况我国还有多个民族的,汉字也有简繁两种写法等。于是1995年,我国发布的GBK编码,GBK全称为《汉字内码扩展规范》(Chinese Internal Code Specification)在GB2312的基础上增加了近20000个汉字和符号,包括繁体字和生僻字。
这也是目前应用最广泛的中文编码,windwows中文版默认的系统编码就是GBK。
值得一提的是,这些新的编码都是兼容支持ASCII。即前128个数字都和ASCII对应一致。
统一字符编码
各种编码解决了计算机识字问题,但也带来了新的问题:统一问题,即同一个数在不同语言的编码中对应的字符不一样。这会引发混乱。
Unicode
为解决全球字符编码的统一问题,1991年Unicode标准发布。unicode是一种抽象编码标准,规定哪个那个数字对应哪个字符,在一个包含全世界所有字符的集合中,每个字符都有一个自己的编号,称为 码点 。比如
- 汉字“中”的代码点,U+4E2D,对应数字20013
- GBK编码,“中”字则对应 0xD6D0。
注意编码不能只是从字符到数字的一一映射,还要实际把数字表示为字节序列,即如何存储和识别这些数字。前面我们其实把编码等价为字符到数字,因为之前提到的编码都是统一字节长的编码。这事就unicode的重点所在,它并不规定如何将这些代码点存储为字节序列。从而引出了编码格式的概念,UTF-8、UTF-16 和 UTF-32。他们是实际实现unicode标准的编码方案。
utf-8
UTF-8(Unicode Transformation Format - 8-bit)是一种变长编码格式,使用1到4个字节来表示一个字符。它兼容ASCII,对于ASCII字符(U+0000到U+007F),UTF-8直接使用一个字节表示,与ASCII编码完全一致。这使得UTF-8在处理英文文本时非常高效。
对于其他字符,UTF-8使用2到4个字节来表示。例如,常用的汉字通常用3个字节表示。
可以看出,-8存英文是最佳的,等价ASCII,存汉字则不如GBK。而GBK存存英文又不如ASCII(GBK定长2字节)。
uft-16
- UTF-16
UTF-16也是变长编码,使用2个或4个字节来表示一个字符。它更有意思:
- 基本多文种平面(BMP):对于U+0000到U+FFFF范围内的字符,UTF-16使用2个字节表示。这个范围包含了大多数常用字符,包括ASCII、汉字、日语假名等。
- 辅助平面字符:对于U+10000到U+10FFFF范围内的字符,UTF-16使用4个字节表示。这种表示方式称为代理对(Surrogate Pair)。
- 字节序问题:UTF-16涉及字节序问题,需要使用字节序标记(BOM,Byte Order Mark)来区分Big-Endian和Little-Endian。
-16的优点是,使用2字节就能表示全球大部分常用的字符,属于是国际化首选方案。缺点同理,单一场景不如-8。
UTF-32
UTF-32则是一种固定长度的编码格式,使用4个字节(32位)来表示一个字符。
难评,很少用。
兼容性问题
在我们编辑文本,保存后再打开,一定要遵循一个原则,用什么编码保存,用什么编码读取。否则就可能出现兼容性问题,即 “乱码”。为何说可能?因为少数情况的一些编码是相互兼容的,比如对同一语言编码,即原版和扩展版几乎都向下兼容。而伟大的ASCII,可以看作是所有编码的“原版”,大部分编码都兼容ASCII字符。utf-8不必说,本身就可以看作一种ASCII扩展版。而我们的GBK也兼容ASCII字符,因为GBK也算是一种变长编码,遇见ASCII直接单字符解析。要不怎么说英语是计算机的母语呢。汉字就没这样好的待遇了。当你用GBK保存文本,再用utf-8打开时,就会遇见传奇乱码标兵“锟斤拷,烫烫烫”。unicode是能表示所有字符,但不能统一所有标准。
因此,虽然我们常用也就是GBK和uft-8,也要记得文件的编码。
字型和字体
通过编码,计算机将二进制的字节序列识别成了人类认识的字符。但回字有四种写法啊,计算机要怎样把这个字写给我们呢?那就要问计算机的书法老师-操作系统。
操作系统有一个字体库,存放了各种书法作品。通过这个字体库,操作系统给应用软件提供了不同的写字风格。严格来说这种写字的风格称为“字型”,即我们口语中的字体。比如,微软雅黑和苹果方就是不同的字型,一眼就看出来不一样。
- winodws的字体库再C:\Windows\Fonts目录,里面存放的各种ttf,fon文件就是系统能给应用软件提供的各种字型和字体
字型太多了,毕竟涉及搞艺术,美观和个性永远有不一样的。但重要的,常见的字型大致可以分几类:
首先分为两大类:
- 衬线
衬线是指字符的笔画末端带有装饰性的小横线或小脚,笔画粗细有变化,通常竖笔较粗,横笔较细。整体看起来优雅,正式。 - 无衬线
笔画一致,简洁、现代。适合屏幕显示,可读性较好。
再说一些比较常见有代表性的:
- 等宽
每个字符占用相同的宽度,对齐效果好。完美适合编程代码。比较代表性的是Mono家族,其中我最爱JetBrainMono。常见的还有微软的Consolas,苹果的Monaco。 - 黑体
被视作中文字型的标准版。横平竖直,粗细一致。是中文无衬线的代表。用于阅读很舒服。黑体本身就是一种字型,是这一类的代表。windows中文版默认的微软雅黑,也属于这类。 - 圆体
圆润可爱,主打一个卡哇伊。 - 艺术/手写/其他
统称为艺术字
严格来说的字体是一个风格(字型)的具体实现,因为一个字型风格一般都要有标准版(),加粗版斜体。比如点开Arial,这个字型就有很多版本:
软件们显示的字体,一般都来自于系统的字体库。当然软件也可以自己内嵌字体(能调包为啥要自己写?)。
遗憾的是,windows的字体库是给软件们用的,软件通过系统的支持会提供修改字体的选项。但一般来说,系统本身不支持修改默认桌面的字体(其实雅黑也不错)。
参考文献:
Deepseek