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.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;并詳細解釋圖層配置、事件監…