終端字體 | Terminal Fonts
終端字體和代碼字體一樣同衣,也是編程愛好者常用的字體,很多人不會(huì)細(xì)分這兩種字體辛孵,但知?jiǎng)t認(rèn)為有必要區(qū)分這兩種需求。代碼字體主要是用于看代碼的轩娶,所顯示的內(nèi)容對象主要是各類代碼文件或者文本數(shù)據(jù)文件儿奶。但是編程并不是僅僅和文本文件打交道,還需要構(gòu)建和調(diào)試鳄抒。這就會(huì)用到虛擬終端和用于虛擬終端的字體嘁酿。
終端小史
所謂終端機(jī)娱仔,就是一種由鍵盤和顯示器以及必要的通信組件組成的古老設(shè)備牲迫,用于和計(jì)算機(jī)的主體連接盹憎,并于與其中的程序以文本形式進(jìn)行交流铐刘。后來隨著技術(shù)發(fā)展,這類設(shè)備逐漸被淘汰盼产。但是侨核,和計(jì)算機(jī)程序進(jìn)行文本交流的需求還是存在的,于是就有了軟件模擬的虛擬終端設(shè)備,稱為“虛擬終端”轴总。
這些虛擬終端程序本身就是圖形化界面的一個(gè)窗體怀樟,但是窗體內(nèi)部不顯示圖片和動(dòng)畫,僅僅有文本虑灰。和 Word 或者記事本這類文本編輯軟件的不同之處在于字旭,這個(gè)僅僅能顯示文本的窗口并不具有復(fù)雜的樣式和排版功能。所有字符都像大小固定的馬賽克瓷磚一樣整整齊齊地嵌入其中拆讯。這種功能退化一方面是為了準(zhǔn)確還原物理終端機(jī)的使用體驗(yàn)种呐,另一方面則是為了限制整個(gè)設(shè)備的復(fù)雜度——功能越受限堕油、設(shè)備就越簡單卜录、操作也越容易艰毒。如果上手寫過一些簡單的 demo 程序就會(huì)知道柑土,讓程序往虛擬終端輸出點(diǎn)信息可比繪制一個(gè)圖形化界面的窗體簡單多了稽屏。因?yàn)檫@里沒有復(fù)雜的坐標(biāo)获雕、花哨的動(dòng)畫和多變的事件響應(yīng)。
由于這些特性,虛擬終端一直是程序調(diào)試時(shí)的重要工具。所以程序員在編程時(shí),會(huì)非常頻繁地用到虛擬終端直奋。而終端字體弥搞,就是專門用于這些虛擬終端的字體顾腊。
終端字體的需求
用于終端的字體的需求其實(shí)有很多與代碼字體重合杂靶。因?yàn)榻K端輸出的內(nèi)容也是以 ASCII 可打印字符為主凹髓,其他非 ASCII 字符為輔,同時(shí)又要求字符等寬,盡量容易對齊。但終端和代碼編輯的需求有所不同——代碼編輯時(shí),不論是代碼文件還是文本數(shù)據(jù)文件痪署,大體來說都是人能寫,人能讀,同時(shí)大概率要交給程序處理的;但除了人以外,計(jì)算機(jī)程序也能向終端機(jī)輸出文本,而且這些呈現(xiàn)在終端上的文本主要是給人看摔桦,不一定需要交給程序處理兄世。簡單(且不嚴(yán)謹(jǐn)?shù)兀﹣碚f就是鸥拧,代碼是人寫給機(jī)器看的氛驮,為了保證機(jī)器能看懂唉铜,盡量不出現(xiàn)非 ASCII 字符幻枉;而終端是機(jī)器寫給人看的瞻颂,不會(huì)再經(jīng)由機(jī)器處理盖矫,更注重直觀和人方便理解,只要能正常輸出,具體使用了哪些字符關(guān)系不大担映。
因此,終端字體覆蓋非 ASCII 字符的需求其實(shí)要比一般的代碼字體強(qiáng)烈忿危。而且這些額外的字體還不僅僅包括各種自然語言文字,更多地是一些圖標(biāo)符號。因?yàn)橄啾扔谝蛔忠痪涞奈谋荆烁敢饪磮D使碾。
這里簡單解釋一下兄朋,為什么號稱處理純文本的終端機(jī)能夠顯示圖像障本。首先强霎,其實(shí)每一個(gè)文字的字形就是一幅圖,字體文件就是一個(gè)圖片集伐弹。和一般的圖集不同之處在于景馁,這個(gè)圖集中每張圖都有編號笨使,而且那個(gè)編號映射哪個(gè)字都是有專門規(guī)定的。如果你希望利用這套機(jī)制顯示某一個(gè)圖奕翔,那么只需要給這個(gè)圖分配一個(gè)合適的編號,然后把這個(gè)圖放進(jìn)字體文件里拳锚。(這些圖轉(zhuǎn)化成的字符一般不會(huì)在代碼中出現(xiàn),更少由人主動(dòng)鍵入举娩。)
其次,虛擬終端的界面是若干字符像馬賽克瓷磚一樣拼起來的平面區(qū)域滔韵。每一個(gè)字符相對于整個(gè)區(qū)域來說就類似一個(gè)像素點(diǎn)父丰。如果以字符為邊框紋理魏滚,按一定規(guī)則組合排列惠拭,那么整個(gè)區(qū)域就能拼湊出表格甚至圖形的效果。
這些虛擬終端支持的額外字符的寬度一般來說應(yīng)當(dāng)和等寬字體的半角字符一致扛禽。但是有的字體中將其實(shí)現(xiàn)為和全角字符一致锋边。后續(xù)會(huì)根據(jù)類別特殊說明。
表格邊框
描述和來源詳見: https://www.unicode.org/versions/Unicode15.0.0/ch22.pdf
虛擬終端中里雖然用字符當(dāng)馬賽克拼成網(wǎng)格狀编曼,但是卻不能直接把網(wǎng)格邊框顯示出來豆巨。因此要在虛擬終端中表現(xiàn)出表格的效果,就需要讓一些行列的字符顯示為橫線掐场、豎線或者轉(zhuǎn)角來湊成邊框往扔。在 ASCII 字符集中也能用 -|+
之類的字符大概實(shí)現(xiàn)這個(gè)效果,但是總顯得不夠自然熊户。于是當(dāng)年一些終端機(jī)就增加了一些專用于繪制表格的邊框零件的字符萍膛。這些字符也被后來的 Unicode 的 Box Drawing 區(qū)域收錄(分布在 U+2500
到 U+257F
)。以下是一個(gè)用這些字符繪制表格邊框的例子(在文本編輯器中看時(shí)可能有一些空白間隔嚷堡,在終端中則會(huì)連在一起):
╒═════╕
│ Z Z │
╞═════╡
│ZhiZe│
╘═════╛
在終端中繪制表格確實(shí)能讓信息輸出更加條理蝗罗,甚至還能模擬 GUI 的窗口效果,因此不少終端程序都熱衷于使用這些字符蝌戒。
目前據(jù)我所知串塑,以下字體支持這一區(qū)域字符的覆蓋:
- Unifont
- Source Code Pro
- Noto Sans Mono
- Cascadia Code
- Ubuntu Mono (Incomplete)
- Fira Code
- Iosevka
- Source Han Sans HW SC VF (Full-width)
- Sarasa Gothic
- LXGW WenKai Mono
Incomplete 表示覆蓋不全面,缺失部分字符瓶颠。
Full-width 表示將這類字符實(shí)現(xiàn)為了和漢字等寬(而非和拉丁字符等寬)拟赊。
這些詞在后續(xù)小節(jié)的列表中出現(xiàn)時(shí)意義同此,不再重復(fù)粹淋。
紋理繪制
描述和來源詳見: https://www.unicode.org/versions/Unicode15.0.0/ch22.pdf
可能你在見過一些用文字拼湊出漫畫形象乃至照片效果的文本吸祟。這類作品有時(shí)會(huì)被稱作“ASCII Art”瑟慈。其基本原理就是把每一個(gè)字符當(dāng)作了像素點(diǎn)或者小的紋理塊,通過大面積的字符矩陣來拼湊出圖像的效果屋匕。這個(gè)技巧當(dāng)然用 ASCII 也能玩 葛碧,但是由于 ASCII 字形設(shè)計(jì)并不是絕對均勻的,所以色塊填充效果并不是很好过吻,要達(dá)到比較好的效果往往需要很大的字符矩陣进泼。
Unicode 中的 Block Elements 區(qū)域(從 U+2580
到 U+259F
)則是一組專門設(shè)計(jì)的均勻紋理塊和不同長寬的矩形。用它們做像素畫能彌補(bǔ) ASCII 字符集的表現(xiàn)力不足纤虽。此外乳绕,和虛擬終端的字符顏色控制搭配,這些字符還能做出類似 GUI 界面的陰影效果逼纸,乃至顯示一些簡單的彩圖洋措。
雖然理論上虛擬終端能顯示一些彩圖,但是由于字符顏色一般只有前景后景杰刽,而且字符數(shù)量往往很有限菠发,所以實(shí)際的顯示效果不可能做到非常好。這些紋理繪制字符存在的意義是給虛擬終端錦上添花贺嫂,而不是取代顯卡和像素顯示器滓鸠。
以下字體支持這一區(qū)域字符:
- Unifont
- Source Code Pro
- Noto Sans Mono
- Cascadia Code
- Ubuntu Mono (Incomplete)
- Fira Code
- Iosevka
- Source Han Sans HW SC VF (Full-width)
- Sarasa Gothic
- LXGW WenKai Mono (Incomplete)
Powerline Symbols
Powerline 是著名終端純文本編輯器 Vim 的一個(gè)插件,能在終端中提供看起來不那么死板的狀態(tài)欄和提示行第喳。為此它在 PUA 區(qū)域約定了幾個(gè)符號糜俗。這些符號有的是組成狀態(tài)欄的形狀和箭頭,有的則是表示代碼狀態(tài)的 logo墩弯。例如說這兩個(gè)字符
和
在一般字體中沒有字形吩跋,但是在支持虛擬終端符號的字形中顯示為一個(gè)三角和一個(gè)表示代碼分支的符號寞射。當(dāng)程序輸出這些字符時(shí)渔工,如果你的終端字體也支持這些字符,那么就能看到一個(gè)漂亮到不像終端提示行的終端提示行桥温。后來這些字符約定和相應(yīng)的字形火出了圈引矩,在 Vim 以外也開始使用這些字符和字形。
以下字體支持這一區(qū)域字符:
- Cascadia Code
- Fira Code (Incomplete)
- Iosevka
- Sarasa Gothic
- LXGW WenKai Mono
Powerline Extra Symbols
Powerline Extra Symbols 算是一個(gè) Powerline 的拓展項(xiàng)目侵浸,在 Powerline 的基礎(chǔ)上約定了更多花哨的形狀和 logo旺韭。但是其普及程度不及 Powerline。內(nèi)嵌了 Powerline Symbols 支持的字體不一定支持 Powerline Extra Symbols 的拓展字符掏觉。
以下字體支持 Powerline Extra Symbols 額外拓展的字符:
- Cascadia Code
- Iosevka (Incomplete)
- Sarasa Gothic (Incomplete)
- LXGW WenKai Mono (Incomplete)
本文源碼采用 MIT 協(xié)議開放区端,托管于: https://github.com/ZhiZe-ZG/ZZToolLibrary
如果覺得本文內(nèi)容對您有用,希望您能在能力和意愿范圍內(nèi)給我一些資助澳腹。我不以此為生织盼,但我也是個(gè)普通人杨何。