
我試圖了解文本如何出現在螢幕上的完整故事。為了簡單起見,我繼續使用單字節編碼(無 Unicode)。
我的磁碟上有一個位元組序列,每個位元組的值都在 0 到 255 之間。我可以使用 ISO-8859-1,例如,值為 0xA4 的位元組是一些有點 (¤) 的圓圈。或者我可以切換到 ISO-8859-15,然後我的值為 0xA4 的位元組被定義為歐元符號 (€)。
這一切仍然很容易理解。但與更改字元編碼並行,我還可以更改字體來定義符號的確切形狀。現在,字體應該與全部字符編碼。因此,字體應該同時具有兩個符號:¤ 和 €。
因此,在螢幕上獲取文字的步驟顯然是:
- 串行讀取位元組序列
- 使用目前位元組的數值來尋找字元編碼表
- 使用 [something] 在字體檔案中尋找以取得步驟 2 中找到的符號的確切形狀
- 繪製像字體檔案中定義的符號
在步驟 3 中,用於將字元編碼對應到字體的「東西」是什麼?字體檔案依賴字元編碼嗎?那麼,字體是否有一些內建的「雙開關」機制,其工作原理類似於(偽代碼)
get_symbol(code, encoding) {
switch code{
case 0xA4: switch(encoding) {
case 'ISO-8859-1' : return '¤';
case 'ISO-8859-15': return '€';
}
}
}
?
如何從給定的位元組序列和給定的字元編碼到字體中的實際符號有哪些細節?如何映射以始終給出正確的符號?
答案1
字體檔案旨在顯示特定的編碼。使用給定字體的程式必須假設給n
定編碼中的值是透過呈現相應的字形編號來顯示的n
。
字型檔案不需要包含給定字元編碼的所有可能值的字形(對於 Unicode,字型很少覆蓋整個範圍),也不需要從編碼中的第一個值開始(通常省略控製字元) 。有不同的檔案格式方案用於指定起點、終點和省略的字形,用於保持字型檔案大小的可管理性。
從給定的範例來看,OP 很可能使用 X Window 系統。使用的文件格式不只一種,其存取方式也相應不同。主要的有XLFD(較舊)和字體配置(較新)。對於其他系統(Microsoft Windows),請使用其他 API(LOGFONT
結構是一個很好的起點)。 OSX 是另一個例子,有自己的 API (核心文字)。
這些當然是用於圖形介面的。字體的應用範圍比這更廣泛。例如,Linux 和 BSD 允許指定不同的控制台字體——除了編碼之外,可用的字形數量也受到限制。以下是一些有用的連結:
答案2
繪製文字的應用程式在其使用的文字繪製 API 中指定字體,如果未指定,則使用系統預設字體。
基於 Unicode 的文字繪製系統通常具有字體替換演算法,用於在指定字體不具有所請求的字形的情況下尋找包含特定字形的字體。但 Unicode 之前的系統通常無法繪製字形或繪製「缺失字形」字形。即使基於 Unicode 的系統有時也會繪製「缺少字形」符號。