2018年2月8日 星期四

漢字使用環境的建置 ㈠ —— 顯示篇

楔子


隨著歲月一年年的過去,我也一步步地愈來愈接近「從職場上退休」的這檔事。這幾年我一直在想,等真正退休後我該做些什麼呢?該怎樣過屬於自己的日子呢?雖然很多想法都不是很確定、有點點模模糊糊,但其中有一件事我倒是很肯定,那就是「閱讀」—— 閱讀我自己有興趣的書。

為著這個想法,這幾年我一直在試圖布置屬於自己的數位化閱讀環境。收集整理資料、設計製作工具,整個人幾乎是處在「閉關」的狀態,不再分心他務,連部落格也沒空搭理耕耘。時至今日也算累積了一些些心得,想藉著自己的部落格再記錄下來,於是又計畫開始寫一系列的心得筆記。中華電信的隨意窩充斥著廣告,不時干擾著我想安安靜靜閱讀記錄的情緒,於是放棄繼續,選擇可以沒有廣告、乾乾淨淨的 Blogger。把書呆筆記的幾篇相關舊文搬過來,做為重新出發的開始,然後便再繼續寫下去。

漢字顯示


現代人的生活,大概都離不開電腦,而身為華人的我們,使用電腦時自然離不開漢字。現在的電腦不是都能顯示中文嗎?這還有什麼值得探討的呢?關鍵就在於咱們的老祖宗實在太喜歡造字,不停地創造新的漢字。當然有時是寫了別字、訛字,但這些別字、訛字繼續流傳下來,又成了今天漢字的一部分。根據 Unicode 定義的電腦漢字,從常用的基本字區,一路 A、B、C、D 區擴充下來,現在已經來到了 F 區(眼看著 G 區也慢慢逼近),這些字區目前共定義了 88884 個漢字,而有許多漢字還尚未納入其中。

先不談尚未編碼的漢字,光這些已經被定義的近九萬個漢字,您的電腦能完整顯示嗎?答案是:正常情況下 —— 不行。

個人電腦的作業系統一直到了 Windows 8 開始,才支援到 D 區的漢字顯示,Windows 10 到目前為止也還停留在 D 區。換句話說,E、F 兩區的漢字,在正常的情況下您的電腦是無法顯示的。是作業系統不允許顯示這兩區的漢字嗎?這倒也不是,主要是沒有人願意造這些字區的字型,所以想要顯示也沒得顯示【註①】

自造字型


為了個人的閱讀需要,我經常整理一些字典、辭典,接觸一些古代典籍。這些資料之中常會含有一些生僻字,放在現行的電腦上,就出現了坑坑巴巴的一個個方框,俗稱「豆腐」字。雖然 Google 出了個暱稱為「沒有豆腐」的開源字型 —— 「思源黑體」、「思源明體」,但實際上「豆腐」還是很多,缺字缺很大。在遍尋不著解決方案的情況下,我只好自己想辦法,開始動手自己製作字型。

我以當時能找到收字最多的字型 —— Windows 8 的「細明體&新細明體」為基底,開始收集其他來源的字型,一點一滴地疊加進來,慢慢把缺掉的字區補齊。字形的來源很雜,包括 BabelStone Fonts全字庫正宋體IPA 明朝體花園明朝體以及一些網友製作的字形,再有缺的就自己造字補上。就這樣我做出了兩套給自己使用的「完全漢字」字型,包含了直到 F 區的所有 CJK 漢字以及絕大部分的 Unicode 字符。為了避免跟作業系統的字型相衝突,我將它們命名為「全細明體」和「全新細明體」【註②】,這樣安裝進作業系統後,就可以直接使用了。

我用這兩套字型做為顯示,整理文檔、製作辭典,真是非常愉快,再也不用看「豆腐」字的臉色了。

猶有不足


可惜好景不常,很快地我又發現,光是這些 Unicode 定義的漢字還是不夠,像《康熙字典》、《漢語大字典》,甚至教育部的《重編國語辭典》以及我製作的「部件檢索」等等都還是需要一些 Unicode 沒有定義的字符。於是我又醞釀擴充,想把這些缺字補起來。這時剛好結識了對岸的網友 —— 紫雪藍海兄,他整理了一套私造字型,包含了《漢語大字典》的所有字頭缺字,但苦無檢字方法。於是我、紫兄和瑾昀三人一起合作,把紫兄提供的字型、以及「部件檢索」用到的部件字型(源自於中研院的漢字構形資料庫)全部重新整理,去蕪存菁,重訂編碼,另外製作了一套補充字型。結合了「部件檢索」的檢字功能,使得這些 Unicode 尚未編碼的漢字得以顯示、檢索,就像正常的已編碼漢字一般。至此我的漢字顯示環境算是「大勢底定」,可以實際上線運用了。

特別要提醒注意的是,補充字區的訂定只是一種暫時性的權宜之計,讓尚無 Unicode 官方標準之前有個可以使用的臨時管道。若某些補充字日後被官方正式收錄,那它們將從補充字中被剔除,移入正式字區。這些空下的碼位有可能被回收利用,再定義為其他新的補充字。因此每次新的官方標準發布後,都應該立即檢查一次補充字,將已正式編碼的字進行遷碼處理。

公開分享


經過兩年多的累積,我們所整理收集的補充字也來到八千多字。這些 Unicode 尚未編碼的漢字,來源多半是各類字典、辭典或是一些古籍的缺字,對於這些資料的數位化呈現、檢索應該有一定程度的幫助。

因此我想,這樣的一套「完全漢字」字型,應該把它公開分享出去,讓從事學術研究或跟我一樣喜愛閱讀的人可以進一步地加以利用,才能發揮它的最大價值。但第一個遇到的問題就是,我的基底字型用的是「細明體&新細明體」,這是個作業系統所附的商用字型,據此修改的字型若公開發布,恐有侵權的問題。於是我改用全字庫的正宋體做為基底字型(它的最新版本已經支援到部分 E 區字形),重新做了一套字型,為與原版字型做區別,我將它命名為「全宋體」,希望能幫助大家解決漢字顯示的問題。

下載連結:全宋體.zip

安裝說明


壓縮檔裡共有 8 個檔案,說明如下:
  • FSung-1.ttf —— 第 1 字面的字符,主要為各式符號。
  • FSung-2.ttf —— 第 2 字面的字符,擴展 B、C、D、E、F 區的漢字都在此。
  • FSung-3.ttf —— 第 3 字面的字符,預留給擴展 G 區的漢字使用。
  • FSung-F.ttf —— 第 15 字面的字符,Unicode 尚未編碼的補充漢字在此。
  • FSung-m.ttf —— 第 0 字面的字符,基本漢字區、擴展 A 區的漢字在此,外文字符為等寬字。
  • FSung-p.ttf —— 第 0 字面的字符,基本漢字區、擴展 A 區的漢字在此,外文字符為比例字。
  • SurrogateFallback.reg —— 字型的串接註冊機碼,讓多個小字型能串接成一個大字型使用。
  • 漢字簡易測試.txt —— 漢字顯示的簡易測試檔。

  1. 直接用作業系統的「記事本」打開 "漢字簡易測試.txt",應該可以看到充滿「豆腐」字的結果。
    (此為在 Windows 7 下的結果)
  2. 將 6 個 ttf 檔案按照正常的字型安裝方式進行安裝,在控制台裡應該可以看到 6 個新增的「全宋體」字型。
  3. 雙擊 "SurrogateFallback.reg" 進行字型串接的註冊設定,請選擇信任、匯入機碼。
  4. 選擇「記事本」功能表上的「格式\字型...」,將字型改為「全宋體(等寬)」。
  5. 如果看到「豆腐」字都不見了,恭喜你,代表安裝成功了。

安裝成功後,建議將您慣用的純文字編輯軟體(例如 UltraEdit、EmEditor 等等)的顯示字型改為「全宋體(等寬)」,這樣就可以享受沒有「豆腐」字的編輯環境了。今後我分享的「部件檢索」、各式離線辭典,都會陸續開始支援「全宋體」字型的顯示。

後記


「全宋體」字型雖然某種程度上解決了漢字的顯示問題,但它仍不完美,各區字形的風格仍不算很一致,與專業的字形設計產品相比,缺點滿滿。但我個人的時間、能力有限,只能先求有、先求全,顧不上風格方面的美學問題,我盡力了,呵呵!

此字型的完成,是我和幾位朋友兩年多來的點滴累積,字形資料的來源,源自於全字庫正宋體、BabelStone Fonts、IPA 明朝體、花園明朝體以及一些自行製作的字形,這些都是公開授權的字形資料,我加以整合、修改再運用,應該是可以符合相關的授權規定,也在此感謝這些原字型製作單位的無私奉獻,並致上崇高的敬意。現在將此成果無條件分享出來,樂見學術研究、教育工作、個人閱讀這方面的運用,但請勿用做任何形式的商業營利行為



【註①】其實有一套開源的字型 —— 「花園明朝體」包含了所有的漢字。但對我而言它有幾個缺點:一是它是日本字型,字形的樣式是按照日本的標準製作,有些字跟中港台的字形略有差異;二是為了快速推出包含 Unicode 新字的字形,據說它的新字是採用程式計算產生的方式生成字形,顯得粗糙生硬而不美觀。再則「花園明朝體」包含的字符很多,超過了單一字型容許的上限,必須拆成兩個字型檔 HanaMinA 與 HanaMinB。在「記事本」一類的純文字編輯軟體裡,顯示字型設成了 HanaMinA 就顯示不了 HanaMinB 裡的字;設成了 HanaMinB 又顯示不了 HanaMinA 裡的字。官方似乎沒有提供適當的設定方式,讓使用者可以正常的顯示所有字形。

【註②】原生的「細明體&新細明體」是採用 ttc 的方式將多個 ttf 字型封裝在一起,彼此共用的字型資料只存一份,以最大化縮小字型的體積。但我使用的工具無法直接處理 ttc 的集合式資料,只能解包拆開,故分成兩個字型。「全細明體」對應於「細明體」,外文符號是等寬字形,排列起來整整齊齊,適合用在純文字編輯的場合裡;「全新細明體」則對應於「新細明體」,外文符號是比例字形,排列起來美觀順眼,適合用在中英文混合的排版呈現上。



27 則留言:

  1. 看到遷移啟示,也咚咚咚的跑過來了,恰好見到這個好東西,真是心喜。

    話說分享方式的話,可以使用創用CC的非商業性標章,或看需求加上標示姓名等等。比較方便喔。
    http://creativecommons.tw/explore (台灣創用CC計畫)

    回覆刪除
    回覆
    1. 感謝您的建議,我對這些授權條款一直沒有耐心去仔細研究,等有空時再來研究一下。

      刪除
    2. 我也沒有耐心呢 哈哈 妙哉妙契
      這些都是人道的小智間間,不甘願只範限在人界眼光與格局的,自然難免感到窒礙難通囉 感恩感恩 南無阿彌陀佛
      生前死抓不放
      死後還有期限
      放與不放何預
      只有人間世界
      感恩感恩 南無阿彌陀佛

      刪除
  2. 讚歎讚歎 雖暫無暇細閱,但嗅得出一股臭味相投的氣息。退休後可做的事太多了。末學只恨自己還得忙著打滾呢。不過也已經邊忙著盡點心力了。如為中國哲學書電子化計劃OCR文本校讀,圖文對照,便是利己利人利後人的大事。而先生菩薩長於程序,想必中文顯示之技術必能引領末學的顒顒望著。有緣再會,不知又是何種情境了。資訊不斷進步,對中文顯示或著作、閱讀、傳承,都有積極面,亦如水可載覆。上善若水,亦由衷爾。隨筆誌感,見諒見原。感恩感恩 南無阿彌陀佛

    回覆刪除
    回覆
    1. 久聞先生大名,曾聽引得市阿良兄提起,二位也是舊識。

      先生好嗅覺,我等當屬臭味相投之一群,呵呵!先生之行早已佩服,有緣的話當向先生多多請教,各為傳統文化、漢學略盡綿薄。

      刪除
  3. 回覆
    1. 感謝 suns99 兄,補充漢字的整理沒您的倉頡碼大力幫忙、去重,也不能做到現今的程度。相助之情,由衷感激!

      刪除
  4. WFG兄,你好!
    SurrogateFallback.reg 不能在MAC平台适用,请问MAC平台能实现类似字型串接的功能吗。

    回覆刪除
    回覆
    1. 我沒有 MAC,從來也沒正式用過 MAC,所以對它很生疏。您的提問我也不知道,真是抱歉呀!

      刪除
    2. 了解,非常感谢您的回复!

      刪除
  5. 您好,在下是「一點字坊」的成員,從阿良兄專頁上推介《說文》字典的結連跑來的。感謝先生的努力。不過看到先生說「(花園明朝體)是日本字型,字形的樣式是按照日本的標準製作,有些字跟中港台的字形略有差異」,在下覺得也許有些東西要跟先生分享。

    其實所謂的「中港台字形」未必是傳統字形。無論是臺灣敎育部(臺標)字形、香港敎育參考字形、大陸「規範漢字」字形,都把過往傳承下來的漢字,經過人爲的整改,這些整改,在字源字理上未必十分可取。比如「令」字,下方是跪着的人「卩」,跟「命」字是孿生的,可是臺標、陸規等都改成「マ」形。反而日本對「令」字的處理,還保留了傳承字形,於字源字理上佔優。(當然,日本也有日本的整改,但數量上比台灣少。)

    無論是Windows 8 的細明體及新細明體,還是全字庫正宋體,都是按照「臺標」字形製作,當中有許多上述的問題。而事實上,港台等地的書報印刷,都未必使用「臺標」字形,反而經常會使用傳承字形——即主要依照《康熙》等傳統字書的明體字頭字樣。傳承字形對《說文》等領域的作用,比「臺標」之類的人爲整改字形大得多。

    花園明朝體來自「字形維基」(GlyphWiki),它收錄的字形並非眞的由程式計算而產生,每筆每畫的具體位置還是要由不同用戶仔細調整、登記到維基裏的。程式只是依照人工定好的位置產生出該筆畫的外框而已。GlyphWiki本身就收錄了許多異體字,可以排除日本字形的整改,可以匯出比較純正的傳承字形,例如「香港民間字集 https://github.com/hfhchan/hkcs 」或「醒醐書體 https://blog.xuite.net/duck711118/eudcfont/379653221 」。

    另外,我們「一點字坊」仝寅也仔細比對過以往重要的傳承明體字形,整理成開源的《檢校表》,並以開源的IPA明朝體逐字修改成「I.明體(一點明體) https://github.com/ichitenfont/I.Ming 」。不但字形符合傳承字形寫法,同時它在字型美觀度、外框質素等方面皆有保證。

    若先生日後以I.明體、香港民間字集或醒醐書體等作基底字型,先加進IPA明朝體、花園明朝體,然後才再加進BabelStone Fonts、全字庫正宋體等其他字型,除了可以讓主要字形風格較統一外,字形寫法也會更符合字源字理,對《說文》等領域的作用更大。

    先生若有甚麼問題或意見,歡迎跟在下多多交流^^。

    回覆刪除
    回覆
    1. 小郎兄您好,久仰大名,瑾昀常跟我提及您的字型,我也常關注I.明體等字體。

      於字型我其實是個門外漢,只因找不到合用的完整大字集字型,逼不得已,才自己動手打造。

      我是閱讀傳統的鉛字印書長大的,對您提的「傳承字形」自然不陌生,您提的觀念我也完全認同。不過從我開始整理漢字資料以來,才慢慢了解這裏面的問題錯綜複雜,常常令人左右為難、為之氣結。

      目前普遍被大家接受的編碼標準是 Unicode,Unicode 並不完美,收字原則也常常搖擺,但畢竟他是目前的標準,大家不照著標準走,溝通就會出問題。

      以您舉的例子「令」字來說,Unicode 編了兩個碼位,一個是基本區的「令」U+4EE4,一個是兼容區的「令」U+F9A8。從 Unicode 的字樣文件來看,U+4EE4 一字各表,陸、臺从「マ」;日、韓从「卩」,紛亂由此而起。而 U+F9A8 从「卩」,若依日韓則兩碼同形。從古籍刻本來看,《玉篇》、《廣韻》、《集韻》、《重刊詳校篇海》、《正字通》字形从「マ」;《類篇》、《康熙字典》則从「卩」,所以這二形自古就有,非陸、臺所新改,至於誰合字理,這是另一個課題。接下來的問題就是:這二形該編成一碼?或分成兩碼?若一碼,則二形不能並存,誰存誰廢?若遇上要二形並列的場合(例如異體字列表)怎麼辦?若兩碼,則一字分岐,檢索就會遇上麻煩。這是目前漢字的難題。當然目前 IVS 看起來是一個解方,但還有太多的環境、工具未能支援,要能一體通用,不知道要到何年何月。

      我知道繼承自全字庫(臺標)的全宋體並不完美,但憑我一個門外漢的一己之力,這是不得不的選擇,畢竟要涵蓋 Unicode 11.0 所有的 88889 個漢字,我的選擇不多。我一直希望有更專業的朋友能進來幫忙這一塊,我好脫身去處理更多的漢字典籍,或許小郎兄及您的團隊能考慮一下,幫幫我這個孤軍奮戰的老頭兒,呵呵!

      隨時歡迎多多交流。

      刪除
  6. 老兄你的字形配合思源屏显宋体用着不错,能方便我查字典的时候补全不能以往不能显示的字体,谢谢

    回覆刪除
  7. WFG大德您好
    用了您的SurrogateFallback.reg 設定,在「記事本」中字型改為「全宋體(等寬)」後確實可全部顯示,但是在office word中將字全選改為「全宋體(等寬)」後還是無法自動顯示,須單獨選字改字型才能正確顯示,是否還有哪裡還須修改?

    回覆刪除
    回覆
    1. 您好!據我的了解,微軟的 Office 系列軟體都不遵守系統的 Surrogate Fallback 機制。我曾經嘗試網路上介紹的一些修改機碼的方法,但實測都沒有效果,所以到目前為止我也還沒有找到一個可行的解決方案。

      很抱歉,沒能提供您解決的方法,目前只能將就使用。

      刪除
  8. Windows10 英文系統(我母語是英文)、調台灣地區,但裝了Surrogate Fallback之後,沒有“全宋體(等寬)”。大概因為是英文系統吧,font 名都是英文。
    https://imgur.com/qgQ9KA7

    能選的font名都是英文,也許FSung沒有註冊英文名。

    回覆刪除
    回覆
    1. 我沒想到兩岸三地之外還有人使用我的全宋體,所以沒有留意這件事,呵呵!我研究看看,看怎麼改進。

      刪除
    2. 您直接選 FSung-m(等距)或是 FSung-p(調和)試試。

      刪除
  9. FSung-1,2,3,F自然用不同 “Fontname”,但我建議 "Family Name"統一起來。
    https://imgur.com/HSf5PGp

    比方說,“Calibri”、“Calibri Light”等等可以歸在一起是因為 "Family Name" 是統一的。
    https://imgur.com/eyxOtJa

    我試試用python改改,但我用python是傻逼。

    回覆刪除
    回覆
    1. 多謝提醒,我找時間再試試看。遇到大字型,即便使用 python script 還是會崩潰,所以別試了。用其他軟體,例如 FontCreator 試試。

      刪除
    2. 嗯嗯,我抓了專業的FontLab來玩玩,正在process。
      還有一件事,想請教:
      https://www.unicode.org/Public/13.0.0/charts/RSIndex.pdf

      好像Unicode只提供PDF,沒提供純粹的txt或Excel文件。理論上PDF可以轉成txt,但格式有時會把信息搞亂。我希望保存所有統一碼的漢字,包括每個字的康熙部首和筆畫信息。不知道您有沒有整理過這個資料。

      刪除
    3. 您要的這些資料應該是在 https://www.unicode.org/Public/UCD/latest/ucd/Unihan.zip。這些資料我整理過,印象中比較新的區塊筆畫資料好像不全,不過好一陣子沒看了,不知是否補全,您最好自己看看。我後來想想,您說的統一 "Family Name" 好像有點怪怪的,您舉的例子 “Calibri”、“Calibri Light” 等等,基本上都是同樣的編碼區塊字型但不同的字型屬性(斜體、細體、粗體等等),所以合成一個 Family 很合理。但全宋體的狀況是,同一個字型屬性,不同的多個編碼區塊字型(不同字面),情況好像不大一樣。可以類比的是作業系統裡的新細明體(MingLiU)、新宋體(Simsun),都是拆成兩個字型檔,兩個字型檔的 "Family Name" 是不一樣的(MingLiU、MingLiU-ExtB)。我當初就是學著它們做的。

      刪除
  10. 感謝各位的辛苦工作!我在用txt文檔測試時,未編碼區部分字(比如􅦠[革火言火火])顯示為楷體,是字型本來如此嗎?

    回覆刪除
    回覆
    1. 是的,目前未編碼區的最後兩字是楷體樣貌,這是因為這些字是直接由《教育部異體字字典》的手寫字形轉換而來(這幾字官方原始就是楷體)。呵呵!看著實在不協調,我日前已經重新造了宋體替換。Unicode 15 今天已經正式發布,我正在作最後整理,預計這幾天應該就會發布全宋體的更新,請您再密切注意一下發布訊息。

      刪除
    2. 事常不能盡善盡美,有已是大成就。感謝先生,祝您健康。

      刪除
  11. WFG,你好!全宋體在windows 11下显示不完整,不知道咋弄。WEB程序没問題,因為可以設置多個字體。而notepad或emeditor設置成「全宋體(等宽)」或「全宋體(调和)」,漢字簡易測試.txt中,「擴展 G 區」、「擴展 H 區」、「未編碼漢字區」无法顯示。

    回覆刪除
    回覆
    1. 您好!我的電腦太老,還在用 Windows 7,所以沒注意到這問題。剛剛特別去借了一台 Windows 11 電腦來測試,情況果如您所言。

      上網搜了一下,一個月前有人在微軟的論壇問了類似問題(https://answers.microsoft.com/zh-hans/windows/forum/all/win11%E4%B8%8B%E7%9A%84%E5%AD%97%E4%BD%93%E5%85%B3/5fc69647-8acb-4d05-80c3-e9f358221e05),只是尚未得到有效的回應。

      估計是 Windows 11 改變了這個機制,我會持續關注這個問題,若找到了適當的解決方法,我會在部落格發文說明,感謝您留言讓我知道這個情形。

      刪除