2020年6月30日 星期二

漢字使用環境的建置 —— 全宋體更新

今年三月十日,Unicode  官方發布了最新的 13.0 版,等待多時的擴展 G 區近五千個漢字終於到來,於是我又重新開始投入了漢字的整理工作。由 BabelStone Fonts 取得了兩千多個 G 區字形,另外從 字形維基 補上了其餘兩千多個字形,最後從官方的 CJK Extension G PDF 中抽取了 353 個台灣提交的字形疊蓋上去,我以不到三天的時間製作出了完整的 G 區字型,也初步完成支援 G 區檢字的部件檢索(直接採用 IDS 拆分資料)。與此同時 suns99 兄也同步開工幫忙,對 G 區字逐一編上倉頡碼,一方面方便日後的倉頡輸入,另一方面也方便我進行重複字的比對工作。

遷碼對照表

完成了字型以及部件檢索,有了顯示及檢字的工具,我開始進行 G 區字與補充字的比對,看哪些補充字已經被收入 G 區之中。經過多日的比對,三月十七日完成了一份補充字對 G 區字的遷碼對照表,G 區的 4939 字之中,有 3194 字是已經收編在補充字裏,只有 1745 字算是新增。有了遷碼表,我就能以批量的方式,將我製作的三百餘部辭典,進行遷碼的工作。把用到這些補充字的相關文件,全部轉碼改用正式的 G 區字,然後這 3194 個補充字就可以功成身退了。其中,單單是漢語大字典就有 1931 個字頭由補充字轉入 G 區。

您若曾利用全宋體的補充漢字來製作文件,可借助這個遷碼對照表,將相關的文件快速遷碼至  G 區用字。更新字型之前請務必確認您所有的文件都已遷碼完成,以避免顯示錯亂的情形發生。

G 區優化

把所有我製作的辭典遷碼更新了一輪,忙上了好一陣子。又把與  G 區重複的補充字字形抽取出來,擇其優者取代掉質量較差的維基字形。之後我又對 G 區近五千個漢字,逐字檢查、優化拆分資料,以取得更精確的檢字效果。過程中發現某些字形與原始的 IDS 拆分資料不符,進一步追查才發覺是某些 BabelStone 造的字有問題,於是又對這些字形進行了修正,至此 G 區的字型與拆分資料才算是正式完成。

擴充字庫

自從兩年前發布了全宋體與部件檢索之後,其實我一直在做一個較大規模的整理,就是將全字庫收錄的兩萬多個外字,全部納入我的補充字庫之中。這樣做的目的,是想快速地利用現有的資源擴充字庫的規模,讓在製作辭典或數位化典籍時能減少缺字的困擾。

有朋友疑惑地問:為什麼不直接用全字庫的字型資料就好?一方面是我已有自己整理的八千多個補充字,這些字全字庫大部分沒能涵蓋;另一方面,全字庫的數據瑕疵很多,不經整理,難以有堪用的品質。

全字庫的數據是完全公開的,開始製作的當下,取得的是 2018-10-02 的版本,提供有宋體、楷體兩種字型,宋體的外字字型 TW-Sung-Plus-98_1.ttf 裏共有 23828 個外字字符,扣除一些空字及非漢字,實際有效的漢字字形為 21938 個。數據裏除了字型外,尚包含有 CNS 碼對 Unicode 的對照表、部首、筆畫、倉頡碼、注音、拼音、筆順、部件拆分等數據。乍看之下似乎很完整,但實際上問題很多。

首先 CNS 碼對 Unicode 的對照表並不完整,在外字之中實際上有很多字是 Unicode 的已編碼字,官方並未完整地整理出對應關係。其次是筆順、部件拆分的資料錯誤極多,很多與字形根本不符,也有一千五百多字完全沒有拆分資料。另一個問題是某些字形重複造字,或是筆畫差異極小的字重複收錄。

在 suns99 兄的協助下,花了近兩年的時間,我大致上已將全字庫的外字清理出來。去除 Unicode 已編碼字、合併重複字與差異過小的字,最後實得約一萬八千個外字,若再扣除與既有補充字的重複,實際增收約一萬六千個外字。我將製作過程所整理的數據,做成了一部《全字庫》字典,雖然沒有實際的釋義,用處也不大,但完整收錄了全字庫的數據,也記錄了比官方數據更為完整的 Unicode  對應關係。透過部件檢索檢字,查詢這部《全字庫》字典,可以查得該字的 CNS 編碼,並可直接點擊跳轉官方的對應頁面,這實際上要比官網的查詢功能還要來得方便而精確了。

至於拆分資料的部分,由於全字庫的拆分是拆到最細(最大拆分),而做為部件檢索用途,最小拆分才能達到最佳效果,因此我需要逐字加以調整、訂正。目前全字庫缺掉的一千五百多個拆分數據,我已逐字補上;調整、訂正的部分則完成了數千字,還有萬餘字等待檢覈。原本想等全部完成再對外發布,無奈父親一病讓我耽擱了大半年,再加上 G 區字既出,很多朋友等著有工具可以支援,因此只好先將這個尚未完全優化的版本推出,讓大家先有個工具可用,至於進一步臻至完善,只好徐徐後圖了。

字型更新

經過這些冗長繁複的整理,這次更新給大家的全宋體,除了基本字區(新增 13 字)、A 區(新增 10 字)、B 區(新增 7 字)、C 區、D 區、E 區、F 區、G 區(4939 字)的已編碼漢字共 93858 個外,再加上 24856 個 Unicode 尚未編碼的補充漢字,總計共有 118714 個漢字,逼近十二萬大關。除了涵蓋 Unicode 13.0 的所有漢字之外,更涵蓋了所有台灣 CNS 標準的編碼漢字,大幅提升了可用漢字的數量。

下載連結:全宋體.zip

安裝字型的方式請參閱 漢字使用環境的建置 ㈠ —— 顯示篇 的說明,而更新字型之前請務必確認您所有的文件都已遷碼完成,以避免顯示錯亂的情形發生。


感謝這些原字型製作單位的無私奉獻,現將此成果無條件分享出來,樂見學術研究、教育工作、個人閱讀這方面的運用,但請勿用做任何形式的商業營利行為



10 則留言:

  1. 您好:
    感謝您的分享與整理!
    借用這篇文章的回覆,有個字型的問題想向您請教,還望原諒。
    我自己也在整理文本與字型,其中有些字型在直排時會變成豆腐。翻查網路文章,見到您的一篇舊文提到:
    「原來在字型的 OpenType Layout Feature 裡藏著一個 VerticalWriting 屬性定義,它正是被設計用來負責處理直排的字形修正。」
    猜想我遇到的字型問題似乎和這個屬性有關,不知道您如何處理這個問題?
    百忙中打擾您,祈請海涵!

    回覆刪除
    回覆
    1. 您好!據您的描述「直排時會變成豆腐」,想必橫排時是正常的,我推測跟這個屬性很可能有關。有可能是該字型的 VerticalWriting 指定了直排時要換用哪一個字符來顯示,而這個字符被誤刪而不存在,因此成了豆腐。建議您檢查一下它的 VerticalWriting 屬性內容,看是否如此。

      刪除
  2. 您好:
    感謝回覆!也很抱歉我的問題不太清楚,因為我也是這陣子才開始學習,還在摸索。
    在win系統上看,橫排時是正常的,直排時字仍是橫的或是變成豆腐;在iOS系統上看,能支援字型的APP橫排正常,直排變成豆腐。
    我試著用FontForge打開字型,但找不到在哪修改VerticalWriting;如果用transform將字型全部旋轉,似乎也不是修正排版屬性。
    不知道要如何檢查、修正VerticalWriting這個屬性?若能簡單提示,我再自行尋找教學即可,謝謝!

    回覆刪除
    回覆
    1. 於字型我也是個半吊子。建議您用 FontCreator 試試,在它的 Font 功能表下有一 OpenType Designer...,然後在 Features 下就有 VerticalWriting 這個屬性可編輯。

      刪除
  3. 无法显示:[⿰册司]、⾓

    回覆刪除
    回覆
    1. 感謝反饋。請問[⿰册司]字的出處為何?您提的 "⾓" 為康熙部首專用符號,並非標準漢字,但全宋體也可顯示呀,您所謂 "无法显示" 是何指?

      刪除
    2. 我是在编辑《汉字源流字典》(谷衍奎 北京-语文出版社,2008.1)的时候遇到的:

      1、关于“角(简体中文)、⾓(繁体中文)”(详见P473的截图 https://sm.ms/image/64g1QtS2nqzlFxO),我想同时显示,但好像用全宋体无法做到。
      2、关于[⿰册司](详见P1592的截图 https://sm.ms/image/iSwelTO7Ev32Irc)

      刪除
    3. 1. 「角」字,在 Unicode 的標準下,兩岸的字形不同,佔用同一碼位。這一類問題也是我處理字庫時最大的困擾,順了這邊就逆了那邊。不得已,只能定下一個原則:原則上字形優先依台灣標準,少數台灣標準字形並不恰當的,才採大陸或其他地區標準。這字則古籍二形互見,因此我於補充字添了一個「󾉟」,讓兩形需要並陳的地方得以運用。請勾選「包容異體」以「角」直接檢索,便能同時找到二形。

      2. 關於[⿰册司]這字,目前字庫確實未收,我再補進字庫,下版更新。

      刪除
    4. 原来如此,感谢详细答疑!期待更新。

      刪除