還記得,那是一本由「守寫字」團隊所推出的《我寫的這一年》造字日曆,是我在年初時參與集資並購入的。
這本日曆的特色,便是可以讓購買者依循內容指引,並搭配他們的製作系統每天寫下文字。
並且在一年之後,誕生出一套紀錄著自己獨特筆跡的數位字體。
而隨著時間飛逝,看著桌上那本漸皺的日曆,一年又這麼結束了,究竟我能做出什麼樣的成果呢?
首先來到造字曆 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 年《拾光造字曆》的朋友,不知道大家又是抱著怎麼樣的信念,來完成這份作品的呢?
《全文。終了》