当前位置: 首页 > ai >正文

PDF文件基础-计算机字体

计算机字体的原理包含了字符编码、字形渲染和字体文件存储三个关键技术。

  • 字符编码负责将每个字符映射到一个唯一的数字码;
  • 字形渲染则将这些数字码转换成屏幕或纸张上可识别的图形;
  • 字体文件存储则包含了字符的编码、图形描述信息以及字体的其他属性,如字重、风格等。

一、字符编码

这里我们首先需要区分两个概念:字符集(Character Set)编码(Encoding)

  • 字符集(Character Set):一个系统支持的所有抽象字符的集合。它定义了“有哪些字符”,并为每一个字符分配一个唯一的码位(Code Point)。例如ASCII字符集、Unicode字符集。
  • 编码(Encoding):将字符集中的码位转换为计算机中实际存储和传输的二进制数据(字节序列)的具体规则,主要解决“如何存储和传输”的问题。例如:UTF-8,UTF-16,UTF-32。
  • 字符编码标准一般除了描述字符编码方式外,也会提供自己的字符集,比如国标GB 2312,不仅定义(描述)是一种编码方式,也定义(描述)了让计算机识别和显示汉字的字符集。
1、ASCII字符集(及编码)

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是计算机早期最简单的字符编码标准。诞生于1960年代,主要位英文设计。

在早期它仅定义了128个字符(7为二进制,从0到127),其中:

  • 0-31为控制字符(如换行LF、回车CR、响铃BEL);
  • 32-126为可打印字符(包括空格、数字0-9、英文字母A-Za-z、各种标点符号);
  • 127为删除字符(DEL)。
    由于字符有限,它无法表示英语之外的任何语言。后来出现了扩展的ASCII(8位,256个字符),用于容纳一些西欧字母。但是256个位置远远不足容纳全球的所有文字。随计算机的普及不同地区有了不同的扩展标准(如中国的GB 2312)。
    (不同的扩展标准极易造成冲突和乱码,为解决这个问题,后面定义了国际标准Unicode字符集,也称为万国码。)
2、Unicode字符集及编码

为了解决ASCII的局限性,一个旨在收录全世界所有字符的宏大项目——Unicode(万国码、统一码)诞生了。
Unicode字符集位世界上所有书写系统使用的每一个字符提供了一个全球唯一的标识符(码位),甚至包括一些表情符号。
Unicode字符集标识符(码位)使用U+XXXX表示(其中XXXX表示16进制数),标识符(码位)的范围是U+0000U+10FFFF
Unicode字符集只定义了字符和码位的映射关系,这个码位应该如何存储在计算机中就是各种Unicode编码方案(Unicode Transformation Format,UTF)的工作,常见的Unicode编码方案有三种:UTF-8、UTF-16、UTF-32。

标识符(码位)范围为啥是U+0000U+10FFFF(21位)呢?

这个源于Unicode最古老的编码之一——UTF-16的设计。
最初的Unicode认为65536个字符足够容纳所有的现代语言的文字。这个空间被称为基本多文种平面(BMP,Plane 0)。BMP平面涵盖了几乎所有常用字符。但随着时间推移,需要加入更多的历史文字、符号甚至表情符号,16位的空间被迅速填满。
为了突破16位的限制,Unicode设计了一套巧妙的代理对(Surrogate Pairs)机制。它们在BMP内部预留的一段特殊区域(U+D800到U+DFFF),这段区域不用于表示任何字符,这个区域被称为代理区:高代理(High Surrogate):U+D800到U+DBFF(210=1024个值);低代理(Low Surrogate):U+DC00到U+DFFF(210=1024个值)。用一个高代理码元后跟一个低代理码元,组合起来表示BMP之外的字符。
根据代理对的总组合数:1024(高代理)x1024(低代理)=1048576个字符,正好对应16个附件平面(16x65536=1048576),再加上基本平面,所有Unicode的总平面数是17。而220=1048576,不足以表示所有能定义的字符,因此Unicode的逻辑地址空间被定义为从U+0000到U+10FFFF(221=2097152, 完全足够,且留有余地)。

Unicode使用平面的概念组织其巨大的码位空间。其中一个平面就是连续的65536个码位的集合。共有17个平面,编号从0到16。其中:

  • 最重要的平面:
    • Plane 0:基本多文种平面(BMP - Basic Multilingual Plane),U+0000到U+FFFF。包含了几乎所有现代语言的字符、常用符号、数字、标点等。这是最核心、使用最频繁的平面。UTF-16编码在这个平面内的字符只需要两个字节。
  • 其他关键平面(辅助平面):
    • Plane 1:多文种补充平面(SMP - Supplementary Multilingual Plane),U+10000到U+1FFFF。包含历史文字(如哥特文、线性文字B)、音乐符号、数学字母符号、绘文字(Emoji)等。
    • Plane 2:表意文字补充平面(SIP - Supplementary Ideographic Plane),U+20000到U+2FFFF。主要用于存放非常用、冷僻的汉字(如康熙字典部首、扩展汉字)。
    • Plane 14:特殊用途补充平面(SSP - Supplementary Special-purpose Plane),U+E0000到U+EFFFF。标签、字形变异选择器。
    • Plane16-16:私人使用区(PUA - Private User Areas),U+F0000到U+10FFFF。用于用户特殊应用场景自定义使用。
(1)UTF-32

最简单粗暴的编码,每个Unicode码位都使用固定的4个字节(32位)来表示。
优点:定长编码,处理速度快。
缺点:一个简单的ascii字符也需要4个字节表示,浪费空间。
因此主要用于内存处理,很少用于文件存储或网络传输。

(2)UTF-16

一种变长编码,对唯一基本多文种平面(BMP)的字符(U+0000到U+FFFF),使用两个字节表示。对其他平面(辅助平面)的字符,使用一对2字节的“代理对”(4字节)来表示。
这是Windows操作系统内部、Java和JavaScript语言内部字符串实现常用的编码方法。

(3)UTF-8

也是一种编码编码,但是支持使用1到4个字节来表示一个字符。

  • ASCII(U+0000 - U+007F)用1个字节编码,且编码值与ASCII完全相同;(这意味着所有ASCII文本本身就是有效的UTF-8文本,具有完美的向后兼容性。)
  • 大部分常用字符(如西欧文字、希腊文、西里尔字母、阿拉伯文等),通常用两个字节编码;
  • 中文、日文、韩文等汉字,通常用三个字节编码;
  • 非常罕见的字符、辅助平面字符、表情符号:使用4个字节编码;
    RFC 3629定义了UTF-8的编码规范,UTF-8也是网页、网络协议、Linux系统、XML/HTML文件事实上的标准编码。

注:UTF-8不需要考虑字节序问题,UTF-16、UTF-32需要注意字节序(大小端)问题。

二、字形渲染

字形渲染时将字符代码转换为图形显示在屏幕或者纸张上的过程。
这一过程涉及数学模型和几何算法,将字符编码映射为特定的图形——字形。
字体文件存储了这些字形的矢量图或位图信息。

矢量字形和位图字形是两种常用的存储和渲染技术:

  • 位图字形则为字形的每个像素定义状态,适用于特定的尺寸,放大后会出现锯齿,目前在嵌入式系统中还存在大量应用;
  • 矢量字形依靠数学方程定义字形的形状,可以在不同的尺寸下无损放大或缩小,现代计算机显示、打印均采用该字形。

三、字体文件

计算机字体文件,可以想象成一个“字形的容器”或一套“字符的设计蓝图”。
字体文件包含了在屏幕或纸张上显示/打印文字所需的所有信息。它不仅仅存储了字母、数字、符号的外形(字形),还包含了字符编码、间距、字距调整等确保文字能正确、美观排版的元数据。
字体文件也主要分为两大类:

  • 点阵文件:早期字体,为每个字号存储一个固定的像素点阵图。
  • 矢量文件:现代主流字体,用数学公式(贝塞尔曲线)来描述字符的形状。
1、常见的字体文件格式
(1)TTF(TrueType Font)

由苹果和微软在1980年代末开发,是历史上最成功、最普及的字体格式之一。使用二次贝塞尔曲线描述字形。在屏幕显示上,尤其是低分辨率屏幕上,有出色的hinting(微调)技术,能让小字号文字更清晰易读。
一个.ttf文件通常包含一种字重(如常规、粗体等),粗体和斜体通常是独立的文件。

(2)OFT(OpenType Font)

由微软和Adobe联合开发,是TTF格式的扩展和升级,现在已成为专业排版和字体设计的新标准。基于更先进的PostScript格式(使用三次贝塞尔曲线),字形描述可以更精准、更流程。
最大的优势在于其跨平台兼容性(同一文件可以在Windows和Mac上完美使用)。支持巨大的字符集,可以包含连字、花体字、小型大写字母等丰富的高级排版特性。
文件扩展名可以是.otf或.ttf(因为OTF有两种内部结构:基于PostScript的和基于TrueType的)。

(3)WOFF/WOFF2(Web Open Font Format)

专为网页设计的字体格式,本质上是一个带了“压缩和元数据”包装的TTF或OTF字体。
WOFF2是新一代标准,比WOFF压缩率更高,能再减少约30%的体积。
网页字体的事实标准,几乎所有现代网站都使用WOFF/WOFF2格式来在线嵌入自定义字体。

2、开源字体:思源 和 Noto
(1)起源历史

在早期,当系统或浏览器无法显示某些文字时(尤其是缺失相应字体),会显示一个空白的方框“□”,被称为“tofu”(豆腐块)。
Google想彻底消除网络上的豆腐块现象,发起了Noto项目(No more tofu),目标就是创建一款覆盖全球所有Unicode字符的字体家族,确保任何语言都能被完美显示。
而思源系列项目,是由Adobe与Google合作发起的,目标是专为中日韩(CJK)文字设计一套高质量、开源的黑体(无衬线体)和宋体(衬线体)。
CJK字符集数量庞大(数万个),在Adobe和Google合作完成了这款出色的开源CJK字体之后,Adobe将其命名为Source Hans Sans(思源黑体),而Google则将其作为自己Noto项目中的CJK部分,命名为Noto Sans CJK
两者的字体设计、字距、度量等完全一致,是100%兼容的,可以看作是同一款产品贴了不同的商标。
后来,它们又用同样的合作模式退出了宋体(衬线体)版本:Adobe命名为Source Han Serif(思源宋体),Google命名为Noto Serif CJK

(2)思源系列 (Noto Sans(CJK) 系列)
  • 提供了从 ExtraLight 到 Heavy 共7种字重(Thin细体、Light轻体、Normal正常体、Regular常规体、Medium中体、Bold粗体、Heavy重体);
  • 覆盖了简体中文、繁体中文、日文、韩文所需的全部汉字和假名/谚文,完整支持中国国标 GB 18030、通用编码标准 Unicode;
  • 使用SIL Open Font License (OFL)开源协议,可以免费用于任何用途(包括商业用途)。
3、Noto 系列(全球版)
  • 思源/Noto CJK 只是Noto宏大家族的一部分。整个Noto家族的目标实现Unicode标准的全覆盖。为上百种文字提供了字体,包括拉丁文、希腊文、西里尔文、希伯来文、阿拉伯文、梵文、泰文、越南文等。
  • 整个Noto家族的设计理念是协调的。当你将 Noto Sans(英文)和 Noto Sans CJK(中文)搭配使用时,它们的风格、灰度、视觉效果非常和谐,不会产生突兀感。这使得它成为多语言混排项目的首选。
  • 同样使用SIL Open Font License (OFL)开源协议,可以免费用于任何用途(包括商业用途)。
  • (Noto Emoji 和 Noto Color Emoji采用Apache License Version 2.0,与 OFL 在允许使用、修改和分发方面的条款类似。)
http://www.xdnf.cn/news/20180.html

相关文章:

  • 【Luogu_P8118】 「RdOI R3.5」Mystery【Slope Trick】【DP】
  • 深度学习基础概念回顾(Pytorch架构)
  • 【Java实战㉗】Java日志框架实战:Logback与Log4j2的深度探索
  • 大型Go项目中搭建CI/CD流水线
  • 竞价代运营:百度竞价账户托管优化
  • VeeValidate v4 终极指南:精通 Vue 3 组合式 API 表单验证
  • Web Worker 从原理到实战 —— 把耗时工作搬到后台线程,避免页面卡顿
  • 计算机视觉(九):图像轮廓
  • 破局功能割裂、成本高昂、协同低效,遨游天通卫星电话实现一机多能
  • Adobe Illustrator(Ai) 2022矢量设计软件的安装教程与下载地址
  • 【Python自动化】 21.3 Pandas Series 核心数据结构完全指南
  • 如何使显示器在笔记本盖上盖子时还能正常运转
  • windows找不到gpedit.msc(本地组策略编辑器)
  • Docker容器安全最佳实践:镜像扫描、权限控制与逃逸防范
  • Pie Menu Editor V1.18.7.exe 怎么安装?详细安装教程(附安装包)​
  • [linux仓库]性能加速的隐形引擎:深度解析Linux文件IO中的缓冲区奥秘
  • Java并发锁相关
  • LeetCode - 202. 快乐数
  • 深度学习——数据增强(Data Augmentation)
  • HTML HTML基础(2)
  • 数控机床中,进行前瞻速度规划时,根据几何约束限制计算的拐角过渡速度
  • HTML基础(决定页面结构)
  • MQTT 与 Java 框架集成:Spring Boot 实战(一)
  • 【GEOS-Chem伴随模型第二期】GEOS-Chem Adjoint 安装与配置
  • 2025年互联网行业高含金量证书盘点!
  • leetcode 2749. 得到整数零需要执行的最少操作数 中等
  • 邪修实战系列(1)
  • 使用CI/CD部署项目(前端Nextjs)
  • SQL Server事务隔离级别
  • JavaScript 面向对象 原型和原型链 继承