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

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

一、字符编码

这里我们首先需要区分两个概念:字符集(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.pswp.cn/pingmian/95886.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95886.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95886.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为IP(9)

OSPF的基本配置OSPF路由计算前言:1)同一区域内的OSPF路由器拥有完全一致的LSDB,在区域内部,OSPF采用SPF算法完成路由计算。2)随着网络规模不断扩大,路由器为了完成路由计算所消耗的内存、CPU资源也越来越多。通过区域划…

java.nio.file.InvalidPathException异常

一.问题概述 本人在ubuntu22.04的操作系统上,运行java程序时创建一个文件时,由于文件名称中包含了中文,所以导致了程序抛出了java.nio.file.InvalidPathException的异常。 java.nio.file.InvalidPathException: Malformed input or input co…

Next系统总结学习(一)

下面我按题号逐条 详细 解释并给出示例与最佳实践。为便于阅读,我会同时给出关键代码片段(伪代码/实用例子),并指出常见坑与解决方案。 1. 你是如何理解服务端渲染(SSR)的?它的核心工作流程是怎…

房屋安全鉴定需要什么条件

房屋安全鉴定需要什么条件:专业流程与必备要素解析房屋安全鉴定是保障建筑使用安全的重要环节,它通过对建筑结构、材料性能及使用状况的全面评估,为房屋的安全使用、改造或维护提供科学依据。随着城市建筑老化及自然灾害频发,房屋…

现代C++:现代C++?

C语言正在走向完美,所以,C语言值得学习(甚至研究),这些知识可以成为一切编程的基础。然而在实践中,不必全面的使用C语言的各种特性,而应根据工程项目的实际情况,适当取舍&#xff08…

【C++】哈希表实现

1. 哈希概念 哈希(hash)又称散列,是⼀种组织数据的方式。从译名来看,有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建立一个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进行快速查找 1.1 直接定址法…

ai 玩游戏 llm玩街霸 大模型玩街霸 (3)

1. 开源代码地址: https://github.com/OpenGenerativeAI/llm-colosseum 2. 架构: 3. 图片: 4. 感觉还是下面的步骤: a. 实时理解游戏当前环境,英雄角色,英雄状态 b. 根据当前状态感知,生成英雄…

2025年渗透测试面试题总结-59(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、SQL注入全解 二、XSS与文件漏洞 三、服务端漏洞专题 四、职业经验与能力评估 1、注入攻击原理是什么…

GPT系列--类GPT2源码剖析

无需多言,大家应该都用过了,如今都更新到GPT-5了。1. GPT-1回到2018年的NLP,神仙打架,BERT与GPT不分先后。GPT是“Generative Pre-Training”的简称,生成式的预训练。BERT和GPT肯定是GPT难训练,引用量也是B…

这是一款没有任何限制的免费远程手机控制手机的软件

这是一款没有任何限制的免费远程手机控制手机的软件支持安卓和苹果1.安装1.1被控制端安装airdroid1.2控制端air mirror2.登录账号控制端和被控制端登录同一个账号3.控制打开控制端软件选择要控制的机器直接点“远程控制“

Observability:更智能的告警来了:更快的分诊、更清晰的分组和可操作的指导

作者:来自 Elastic Drew Post 探索 Elastic Stack 告警的最新增强功能,包括改进的相关告警分组、将仪表盘链接到告警规则,以及将调查指南嵌入到告警中。 在 9.1 版本中,我们对告警进行了重大升级,帮助 SRE 和运维人员更…

数智之光燃盛景 共同富裕创丰饶

8月29日,2025数博会“一带一路”国际大数据产业发展暨数智赋能新时代、共同富裕向未来的会议在贵阳国际生态会议中心隆重举行。作为全球大数据领域的重要盛会,此次活动吸引了来自联合国机构、国际组织、科研院所、知名企业等社会各界的百余位代表&#x…

【网络编程】recv函数的本质是什么?

一、为什么说recv函数的本质是 “copy”? recv是用于从网络连接(或其他 IO 对象)接收数据的函数,它的核心动作不是 “从网络上拉取数据”,而是 “把已经到达内核缓冲区的数据复制到用户程序的缓冲区”。 具体流程拆解&…

JSP程序设计之输入/输出对象 — out对象

目录1、out对象概述2.实例:out对象方法运用输入/输出对象,可以控制页面的输入和输出,用于访问与所有请求和响应有关的数据,包括out、request和response对象。 1、out对象概述 out对象是JspWriter类的一个实例,是一个…

UE里为什么要有提升变量

1、为了简洁当一个类里面的函数比较多,并且使用比较频繁的时候,就要不断的从这个类节点往外拉线,从而获取不同的函数节点,这样的蓝图就会看起来比较乱,这时候,就可以将这个常用的类提升为变量。2、为了存储…

玩转物联网只需十行代码,可它为何悄悄停止维护

文章目录玩转物联网只需十行代码,可它为何悄悄停止维护1 背景:MQTT 遇上 asyncio,为什么选 hbmqtt?2 hbmqtt 是什么?3 安装:一行命令,但别装最新4 五大核心 API:10 行代码跑通发布订…

从零开始学大模型之预训练语言模型

预训练语言模型 本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型开发 学习视频/籽料/面试题 都在这>>Github<< >>Gitee<< 3.1 Encoder-only PLM 在上一章&#xff0c;我们详细讲解了给 NLP 领域带来巨大变革注意力机制以及使用…

JMeter接口测试全流程解析

1. Jmeter的界面介绍和功能组件&#xff08;元件&#xff09;1、测试计划&#xff1a;Jmeter的起点和容器2、线程组&#xff1a;代表一定的虚拟用户&#xff08;一个用户一个线程&#xff09;3、取样器&#xff1a;发送请求的最小单元4、逻辑控制器&#xff1a;控制组件的执行顺…

Effective Modern C++ 条款26:避免在通用引用上重载

在C编程中&#xff0c;函数重载是一项强大的特性&#xff0c;它允许我们为不同的参数类型提供不同的实现。然而&#xff0c;当涉及到通用引用&#xff08;universal references&#xff09;时&#xff0c;重载可能会带来意想不到的问题。Effective Modern C的条款26明确指出&am…

OpenLayers数据源集成 -- 章节一:图像图层详解

前言在前面的文章中&#xff0c;我们学习了OpenLayers的基础控件操作。本文将深入探讨OpenLayers中的图像图层&#xff08;ImageLayer&#xff09;功能&#xff0c;通过一个完整的示例来展示如何使用ImageArcGISRest数据源加载ArcGIS服务&#xff0c;并详细解释图层配置、事件监…