2023-12-31|閱讀時間 ‧ 約 28 分鐘

[突發專案] 實用未滿,堪用亦難|年末字體充實計畫 - 手寫造字系列

文前碎碎唸

還記得,那是一本由「守寫字」團隊所推出的《我寫的這一年》造字日曆,是我在年初時參與集資並購入的。

raw-image


這本日曆的特色,便是可以讓購買者依循內容指引,並搭配他們的製作系統每天寫下文字。

並且在一年之後,誕生出一套紀錄著自己獨特筆跡的數位字體。


而隨著時間飛逝,看著桌上那本漸皺的日曆,一年又這麼結束了,究竟我能做出什麼樣的成果呢?

成果檢視

首先來到造字曆 APP 的字體管理區,從這裡就能看到這段時間以來,所寫下的字數統計。

自從年中紀錄 1400 字左右之後,經過半年努力下來,已經增長到 2140 字了。

雖然還遠不及台灣常用繁體 4000 字的目標,但應該也足夠應付一些虛寒問暖的雜項了⋯吧?

畢竟,除了一開始有寫了幾頁增補字庫外,後來就都只有使用本體的部分了。


在每天限定主題,又精簡內文的情況下,豐富程度的增加固然有限,但也依然可以感受到時間累積所帶來的效應了。

另一方面

除了實體版本的日曆之外,我在更早期時,有使用他們的線上工具製作過另一套字體。

在這次書寫日曆時,也有藉機以更有系統的擴充了過去缺少的部分。

在成果部分,透過線上會員的管理系統,可以看到這份字體所包含的字數,已經來到 3350 個繁體字。

雖然扣除注音與符號後,在自己實際使用下,已經算是可以應付大部分情況了。

不過,這份字體與理想的常用字庫間,還有著不小的距離。


而在目前自己的專案中,已經難抓出缺字的情況下,是否有更效率的方式,能夠完成目標呢?

再次動工

這次我們選擇以字數較充足的舊有版本字體為基底進行擴充。

鑑於「守寫字」現行提供的造字工具,除了字數統計外,並沒有提供自動缺少字比對的功能。

因此這次專案也以此為發想進行。

先利其器

同樣的,這次以 Python 為開發語言,套件使用的是先前找到,可以讀取與編輯字體檔案的「fontTools」。

常用字列表部分,我是直接引用維基辭典中,「台灣繁體常用字附錄」做為參考。

資源引入

接著就正式開始處理啦,首先第一步當然是要把現在手邊的字體讀進來,那就不囉嗦,直接上程式碼。

import os
from fontTools.ttLib import TTFont

# FontFile
fntf = "MercNote.ttf"

# Get Base Path
baspat = os.path.dirname(__file__)

# Load Font File
font = TTFont(os.path.join(baspat,fntf))

讀取完後,接著就要分析裡面已經有哪些字囉。

不過這部分程式我也還沒完全搞懂,因此先直接引用範例來修改。

# Unicode list in current font
chrlst = []
for cmap in font['cmap'].tables:
if cmap.isUnicode():
for k,v in cmap.cmap.items():
trk = chr(k)
if trk not in chrlst:
chrlst.append(trk)
# End Loop

目前知道這個部分執行完成後,會逐一將字體檔中包含的 Unicode 字碼讀取出來。

接著將字碼用 Python 預設包含的 chr() 函數,將字碼轉為文字後,加入「chrlst」列表中,藉以取得目前的進度。

最後就是讀取從維基辭典存下來的常用字列表,以供比對使用。

# Load Source Dictionary for Commonly Used Traditional Chinese Characters
chrdic = ""
with open(os.path.join(baspat,wdic),"r",encoding="utf8") as f:
for line in f:
chrdic+=list(line.strip("\n"))
f.close()

以上,這次專案所需要的材料就準備完成了。

比對切片

接下來的步驟就很單純了,只要將目前字體與列表比對,列出還差了哪些字就行了。

# Find Missing
towrt = [w for w in chrdic if w not in chrlst]

# Print Result
print("In Font File:",str(len(chrlst)),"\nDictionary:",str(len(chrdic)),"\nMissing:",str(len(towrt)))

不過這次專案的最終目標,是要能系統性的做增補,因此在比對後,還要來安排一下每日進度。

所以最後就以一個列表分段來收尾吧!

# Split Pack
wrn = 30 # Words per pack
spl = [towrt[i:i+wrn] for i in range(0, len(towrt), wrn)]
with open(os.path.join(baspat,"WRD_PAK.txt"),"w",encoding="utf8") as pk:
for pak in spl:
 
# Write to File  
pk.write("".join(pak)+"\n")
pk.close()
print("---\nTotal",str(len(spl)),"Pack")

最後結果會像是這樣,下方圖例有另外將寫入的內容 Print 出來。

這樣就能將尚未完成的常用字分批,再按部就班的完成囉。


實作結束。

結語

看到這個專案,可能有些人會問「既然已經有寫好的部分,那為什麼不直接用 AI 完成呢?」

首先目前所能找到直接能使用的,針對繁體字的也相對少,取用也不是很容易。

再者,其實手寫造字,在這個 AI 氾濫(?)的世道下,看起來或許就跟徒手刨輪子一樣過時,但又何嘗不能是一種對信仰固執的堅持呢。

最後也想問問,如果有跟我一樣,購買這本造字曆,或是「守寫字」與「讀曆書店」合作 2024 年《拾光造字曆》的朋友,不知道大家又是抱著怎麼樣的信念,來完成這份作品的呢?



《全文。終了》

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.