文字顯示3 字型

2021-09-24 12:07:25 字數 3264 閱讀 7576

這個系列前兩文章:

文字顯示1——字元與編碼

文字顯示2——c++字串與字元編碼

字元編碼後只是乙個數字,當要顯示乙個字型時,就需要用到字型,我們需要根據字元從字型種取出對應的資訊,然後顯示。

點陣字型與輪廓字型

最早的字型是點陣字型,點陣字型通過乙個點陣上的點來描述字型,如下圖,分別時16*16和24*24點陣表示「點」字。

點陣字型有乙個很大的缺陷就是,對字型縮放會失真,特別是放大,放大後可以明顯看到乙個個的點,對應字型顯示效果很不好。如下圖是點陣宋體12號與72號字顯示對比。

輪廓字解決字型不能縮放的問題,輪廓字型記錄的是字型的輪廓,也就字型中每一筆的線條,因為記錄的是線條,所以字型縮放時可以重新繪製線條計算字型圖形,從而保證字型不會失真。如下圖是輪廓字型宋體12號與72號字顯示對比。

目前點陣字型已經很少了,基本使用的都是輪廓字型。常見的輪廓字型有truetype字型,字型擴充套件名為「*.ttf「;open type字型,字型擴充套件名為「*.otf「,windows可以直接安裝的字型為true type字型。

文字寬度

字型還分為等寬字型與變寬字型,等寬字型是在同一字型大小下ascii字元的寬度都是一樣,中文字元的寬度為兩個英文本元的寬度,變寬字型在同一字型大小下字元寬度是不相等的。如下圖:

變寬字型更適合閱讀,因為平時書寫的文字字元寬度也是變寬的,符和閱讀習慣,文字顯示一般都會使用變寬字型。等寬字型因為字元寬度一樣,所以文字對齊就非常容易,程式設計中**的顯示用的都是等寬字型。

乙個字型檔案中會包含多個字元,windows系統中使用的都是true type輪廓字型,系統中安裝的字型都可以在」 c:\windows\fonts」資料夾中找到。現在字型基本都是按照unicode編碼進行字元對映的,字元也是按照unicode編碼順序排列的。雖然是按unicode編碼順序對映但是字型中通常不會包含所有的unicode字元,例如英文本型只會包含英文本元,中文字型不會包含一些特殊語言(韓語,日語)的字元。

英文本型,因為英文本元少所以包含的字元也可以比很少,例如「bell mt」字型只包含了243個字元。有些「英文本型」中包含了多種語言,例如」arial「字型,其中包含了4503個字元,其沒有包含中日韓語言,包含了許多其他語言和一些特殊符號的字元。

中文字型,中文最早的編碼是gb2312,gb2312中有6763個文字,有些中文字型只會包含gb2312中的字元,這種字型一般包含七八千個字元,多出來的字元一般是英文本元已經一些特殊符號。因為gb2312中不包含繁體文字編碼,所以這種字型不支援繁體顯示。中文後面有了gbk編碼,gbk中有23940個文字,現在很多中文字型都包含了gbk中的字元。包含gbk編碼的中文字型字元個數在兩萬以上。因為gbk包含了簡體和繁體文字,所以這種字型同時支援簡體和繁體顯示。雖然中文字型中包含的是gbk/gb2312中的字元,但文字是按照unicode排列的。

google noto字型,這是開源字型可以免費使用,該字型的目的在於用一種字型顯示所有的語言。因為其要包含所有的語言,所以這種字型包含的字元比較多,一般都有六萬多個,基本包含了unicode第0平面的字元,常用的文字都可以顯示。思源宋體就是noto字型中的一種。

推薦一款軟體

high-logic maintype

,這個軟體可以檢視系統中已安裝的字型和字型檔案中的字元,字型中包含的字元個數。

顯示文字需要使用字元的編碼到字型檔案中找到相應的字元,然後將字元繪製出來。

字型中不存在的字元

前面說過字型中包含的字元是有限的,英文本型中可能不包含中文字元,中文字型中不包含日語等等。如果我用乙個英文本型去顯示中文時,因為字型中不包含中文,會發生什麼情況呢?

未定義字元,字型檔案中一般都包含了乙個未定義字元,如果乙個字元編碼在字型檔案中未定義,一般情況編碼會對映到未定義字元。未定義字元為字型的第乙個符號,編碼為0,如下圖展示了部分字型中的未定義字元:

這裡的截圖是通過high-logic fontcreator軟體開啟字型,從中可以看到未定義字元一般都是乙個正方形,也有直接是空白的。

在一些英文windows系統中,由於沒有安裝中文字型,顯示中文的時候就會顯示未定義字元,如下圖:

避免未定義字元

有些軟體可以同時設定兩個字型乙個中文字型,乙個英文本型,從而避免出現未定義字元,如下圖時word字型設定對話方塊:

在windows系統中一般很少會看到未定義字元,因為當選擇某一字型顯示文字時,當系統檢測到字型中不包含當前要顯示的字元時,會查詢系統中其他風格相近的字型中是否包含該字元,如果包含則會用相應的字型顯示字元。windows系統會盡量讓文字顯示正確,避免顯示未定義字元。

當然並不是每次自動選擇的字型都風格相符,如下只選擇arial英文本型,同時顯示中英文:

有些特別糟糕的情況是,windows系統中字型安裝不完全系統在自動選擇字型時會出現文字的粗細斜體都不一致,如下是乙個wpf視窗程式:

解決這種問題最好的辦法是選擇乙個同時包含中英文的字型。

這個系列前兩文章:

文字顯示——字元與編碼

c++字串與字元編碼

CSS3字型樣式和文字樣式

body body body 上面比這種方法相容性更好一些。bodyp span 粗體樣式 box1 color的值有3種設定方式 p每一項的值可以是 0 255 之間的整數,也可以是 0 100 的百分數。p p這種顏色設定方法是現在比較普遍使用的方法.pbody 可以簡寫為 body 1 使用這...

CSS學習3(字型)

這是最亂的地方,幾乎所有的字型都有多種名字。同種字型的不同風格 斜體,加粗等等 也有不同的名字,為了解決這個問題,css使用font family表示乙個系列的字型,包括這種字型的各個風格。設定時,你可以指定字型系列,也可以指定特定的字型。字型可以設定多個,使用者 會依次查詢,直到找到第乙個可用的為...

CSS3 字型樣式

lang en charset utf 8 css3的其他屬性title type text css font face 宣告使用伺服器端字型 伺服器端字型對otf和ttf這兩種字型格式支援良好 font face p box sizing 設定width和height屬性值包含的內容。div di...