取得字體的包含文字

為什麼要學這個?

可以知道某個字體檔定義了那些文字,進行知道缺字是否有缺字,及之後要先補那些字進去。

下面提供2個範例:

  • 範例1: 取得 fontforge 專案下的文字清單.
  • 範例2: 取得某一個目錄下, 以 unicode 為命名的文字清單.

前置作業

使用方式有2種:

  • 用法1: fontforge + python. (比較簡單)
  • 用法2, 需要先安裝FontForge,把要處理的字體先存成.sfdir 的資料夾格式, 執行時單純地執行 python。

FontForge執行檔下載:
https://fontforge.org/en-US/

Max腳本檔案下載:
https://github.com/max32002/MaxFontScripts/blob/master/get_ttf_chars.py


使用方法

基本語法:

python get_ttf_chars.py <輸入目錄> 

在有 fontforget 指令模式: (建議使用)

fontforge get_ttf_chars.py font_forge.sfdir --output charset.txt

在無 fontforget 指令模式:

get_ttf_chars.py font_forge.sfdir --output charset.txt

參數說明:

  • <輸入目錄> 參數,Font Forge 的 .sfdir 資料夾路徑。.sfdir 可以省略, 程式會自動增加, 輪入必需是一個已存在的 font forget project 目錄.
  • --output 參數,用於輸出的文字檔.
  • --mode 參數,預設值是 “fontforge”, 針對 fontforge 的專案檔做處理, 使用參數 –mode=unicode_image 可以取得使用 unicode 編碼的數字的圖片.

操作範例1:取得字型檔案(.ttf)的文字清單. (建議使用)

fontforget get_ttf_chars.py source.sfdir

操作範例2:取得 fontforge 專案(.sfdir)下的文字清單.

get_ttf_chars.py source.sfdir

使用範例:由於沒有指定輸出的文字檔, 預設會產生 source.txt 文字檔,裡面記錄 source.sfdir 有定義的文字。


操作範例3:取得某一個目錄下, 以 unicode 為命名的文字清單.

get_ttf_chars.py sp --mode=unicode_image

執行結果:

input: sp
output: charset_sp.txt
charset length: 73

結果說明: 輸入資料夾名稱: sp, 輸出檔名 charset_sp.txt, 內容長度: 73個字.

指定 –mode, 不是很直覺, 請改用下面的 script:


字型與圖像字符集提取工具使用教學

這個小工具可以幫你從字型檔案(.otf、.ttf、.woff、.woff2、.sfdir)或是圖像資料夾中,提取出裡面包含的字符集,並輸出成一個文字檔。對於想要了解字型包含哪些字,或是從圖像建立字符集的人來說,非常方便!

使用前準備

  1. 安裝 Python:如果你的電腦還沒有安裝 Python,請先到 Python 官網 下載並安裝。
  2. 安裝 fontforge(如果需要處理字型檔案):如果你需要處理字型檔案,你需要安裝 fontforge 這個工具。安裝方式會根據你的作業系統有所不同,請參考 fontforge 官網 的說明。
  3. 安裝 LibGlyph(如果需要處理 .sfdir 檔案):如果你需要處理 .sfdir 檔案,你需要安裝 LibGlyph 這個函式庫。你可以使用 pip 來安裝: pip install LibGlyph
  4. 準備字型檔案或圖像資料夾:把你想要處理的字型檔案或圖像資料夾放在一個方便存取的位置。

使用方式

  1. 下載腳本:把上面的 Python 腳本複製下來,儲存成一個 .py 檔案,例如 get_ttf_chars.py
  2. 開啟終端機或命令提示字元:在你的作業系統中開啟終端機(macOS/Linux)或命令提示字元(Windows)。
  3. 執行腳本:使用以下指令來執行腳本,並替換成你自己的檔案路徑和選項:
    python get_ttf_chars.py <輸入檔案或資料夾路徑> --output [輸出文字檔路徑] --mode [模式]
    • <輸入檔案或資料夾路徑>:指定輸入的字型檔案或圖像資料夾路徑。
    • --output:指定輸出的文字檔路徑,預設是 output.txt
    • --mode:指定模式,有兩種模式可以選擇:
      • fontforge:處理字型檔案(.otf、.ttf、.woff、.woff2、.sfdir)。
      • unicode_image:處理圖像資料夾,圖像檔名必須是 Unicode 編碼的數字。
  4. 範例:
    • 處理字型檔案:
      python get_ttf_chars.py myfont.ttf --output mycharset.txt --mode fontforge
    • 處理圖像資料夾:
      python get_ttf_chars.py images --output image_charset.txt --mode unicode_image
  5. 查看輸出結果:執行完成後,會在指定的路徑產生一個文字檔,裡面包含了提取出來的字符集。

注意事項

  • 圖像資料夾中的圖像檔名必須是 Unicode 編碼的數字,例如 65.png 代表字元 ‘A’。
  • 如果處理字型檔案時遇到問題,請確認 fontforge 是否正確安裝。

進階應用

字型A (例如: zen maru) 使用的異體字清單如下:

不串丹什來例便僚兀兩凉列利刺力勉勒勤卑句吏呂喇墨壘尿年弄律懶拓易暈暴更林櫓沈洛洞淋濫烈珞理略異碑磊行裏見豈賂賈路車輻郞里量閭阮隆隷駱魯鷺

字型B (例如: noto sans) 也使用了相同形狀但編碼不同的異體字:

兀勉勤卑墨碑隆豈更車賈串句喇懶洛珞駱濫來櫓路魯鷺弄磊賂壘勒丹異便不沈略兩量呂閭力年列烈例僚尿暈阮律利吏易理裏里林淋什刺拓洞暴輻行見

要如何在2個字型, 分別完成對映? 解法是在呼叫 get_ttf_chars.py 增加參數 –altuni 與 –find_alt_text=text

範例:

fontforge get_ttf_chars.py notosans.ttf --output alt_root.txt --altuni --find_alt_text=不串丹什來例便僚兀兩凉列利刺力勉勒勤卑句吏呂喇墨壘尿年弄律懶拓易暈暴更林櫓沈洛洞淋濫烈珞理略異碑磊行裏見豈賂賈路車輻郞里量閭阮隆隷駱魯鷺

這樣就可以取得 notosans 的真正 glyph 本體.

同時附上 mapping 表:

redirect_dict = {19981: 63847, 20018: 63749, 20025: 63838, 20160: 63997, 20358: 63789, 20363: 63925, 20415: 63845, 20698: 63931, 20800: 20800, 20841: 63864, 21015: 63900, 21033: 63965, 21050: 63999, 21147: 63882, 21193: 21193, 21202: 63826, 21220: 21220, 21329: 21329, 21477: 63750, 21519: 63966, 21570: 63872, 21895: 63755, 22696: 22696, 22744: 63818, 23615: 63933, 24180: 63886, 24324: 63811, 24459: 63960, 25078: 63757, 25299: 64002, 26131: 63968, 26248: 63941, 26292: 64006, 26356: 63745, 26519: 63988, 27347: 63793, 27784: 63858, 27931: 63765, 27934: 64005, 28107: 63989, 28651: 63778, 28872: 63903, 29662: 63767, 29702: 63972, 30053: 63862, 30064: 63842, 30865: 30865, 30922: 63815, 34892: 64008, 35023: 63975, 35211: 64010, 35912: 63744, 36034: 63816, 36040: 63747, 36335: 63799, 36554: 63746, 36667: 64007, 37324: 63977, 37327: 63870, 38317: 63878, 38446: 63942, 38534: 38534, 39409: 63770, 39791: 63801, 40442: 63802}

把 mapping 表放在 export_ttf_to_svg.py 內, 就可以讓 zen maru 所匯出的 .svg 可以讓 notosan 直接做匯入.


接續應用

有了清單之後, 就是需要去清單做交集或刪除的過濾.


相關文章: