正确实现简转繁字体

三日月綾香

繁體中文版《正確實現簡轉繁字型》,同时发布于知乎:正确实现简转繁字体 - 三日月 綾香的文章

简介

简转繁字体是将简体文本以繁体字显示的字体。对于习惯阅读繁体字的用户,在某些没有简繁转换的平台(如电子书阅读设备),可以利用简转繁字体将简体文本以繁体字显示,从而减轻阅读时的负担。

然而,现有的简转繁字体是简单地将简体字的码位对应繁体字形,不能处理简体字与繁体字之间存在的「一简对多繁」现象,因此使用效果并不理想,也使许多人产生了「字体不能正确处理简转繁」的错误印象。

事实上,目前通行的 OpenType 字体格式提供了大量字体特性。使用其中的 GSUB(glyph substitution,字图替换)规则,可以实现能处理「一简对多繁」的简转繁字体。

本文介绍了简繁转换工具 OpenCC 与 OpenType 字体的 GSUB 规则,并介绍了将二者结合,在字体层面实现简繁转换的方法。利用同一方法,也可以实现能处理多音字的拼音字体及注音字体。

「一简对多繁」现象

「一简对多繁」是指一个简体字对应多个繁体字的现象。例如,简体字「后」同时对应「」(後面)与「」(太后)两个繁体字。

由于「一简对多繁」现象,在简转繁时需要考虑上下文。

OpenCC 的简繁转换算法

OpenCC 是开源的中文简繁转换工具,可以利用词语处理「一简对多繁」现象。

OpenCC 词库除了定义单字的简繁对应关系外,还定义了数万个词语的简繁对应关系。OpenCC 程序运行时根据「正向最大匹配」算法匹配文章中的简体词语,然后转换为繁体。

例如,在转换句子「太后的头发很干燥」时,程序根据词库中存在的词语,从左至右依次匹配「太后」、「的」、「头发」、「很」、「干燥」,然后分别转换为「太后」、「」、「頭髮」、「」、「乾燥」。

OpenType 字体的 GSUB 规则

OpenType 字体提供了 GSUB 规则,用于替换字体中的字图。

GSUB 规则可以分为以下六类:

  1. single substitution(一对一替换)
  2. ligature substitution(多对一替换)
  3. multiple substitution(一对多替换)
  4. alternate substitution(一对一替换,但提供多种选择)
  5. chaining contextual substitution(带上下文的一对一/多对一/一对多替换)
  6. reverse chaining contextual substitution(逆向、带上下文的一对一替换)

使用 GSUB 规则实现简繁转换算法

简繁转换需要实现多对多替换,例如将「错综复杂」转换为「錯綜複雜」,四个字均发生了变化。然而,以上六种 GSUB 规则仅包括一对一、多对一、一对多替换,却不包括多对多替换。

为了实现多对多替换,可以采用「伪字图」的方法。首先使用多对一替换,将简体词语替换为一个伪字图;然后使用一对多替换,将这个伪字图替换为繁体词语。

示例如下:

输入字符串 U+97E9 U+5267 U+5947 U+7687 U+540E U+64AD U+51FA U+540E
对应简体字图
第一步替换 伪字图 0 伪字图 1 伪字图 2
第二步替换 伪字图 0 伪字图 1 伪字图 2
第三步替换

注意「皇后」、「播出」是繁简同形的词语,但仍要在第一步替换为伪字图,否则会影响第二步替换。

经过简单的试验可以发现,OpenType 字体在执行第一步替换时遵循「正向最大匹配」原则,这与 OpenCC 的简繁转换算法相同,因此二者是等效的。

局限性

句子本身存在歧义

简转繁不可能做到完全准确。例如「时间不准差一分钟」这个句子本身存在歧义,对应的繁体既可能是「時間不準差一分鐘」(不准确),也可能是「時間不准差一分鐘」(不允许)。

OpenCC 简繁转换算法的局限性

「正向最大匹配」算法存在一定的局限性。例如,对句子「拥有 116 年历史」执行正向最大匹配,当匹配到「年」时,由于「年历」是一个词,会被匹配,从而错误地转换为「擁有 116 年曆史」;正确的写法应该为「擁有 116 年歷史」。

OpenCC 词库的局限性

OpenCC 词库不可能囊括所有词语,例如新词不一定能及时收录于 OpenCC 词库中。

OpenType 字体的局限性

在上述方法中,一条简繁词语的对应关系需要使用一个伪字图,而伪字图也会占据字图数量。OpenType 字体的字图数量上限为 65535 个。

为了防止字图数量超过上限,可以采取两种方法:

第一:可以从字体中删除一些生僻字的字图。

第二:可以适当删除一些简繁词语的对应关系。应优先删除繁简同形、且在逐字转换时不会产生错误的词语,例如上面例子中的「播出」。

功能扩展

OpenType 字体的 trad 特性

OpenType 字体提供了 trad 特性。在排版引擎中打开 trad 特性时,字体可以将简体字显示为对应的繁体字。但是,目前支持 trad 特性的字体并不多。

只要将上述替换表放入字体的 trad 表中,就可以制作支持 trad 特性、且能处理「一简对多繁」的字体。

地区字词转换

OpenCC 支持中国大陆、台湾、香港的习惯用字和用词转换。如果在上述简繁词语的对应关系中加入地区字词的对应关系,就可以处理不同地区的字词转换,例如将「内存」轉換為「記憶體」。

另外,OpenType 字体可以根据语言指定不同的替换表。只要根据 OpenCC 词库,在 ZHS, ZHT, ZHH 表中指定不同的替换表,就可以使同一字体在不同语言环境下使用不同的字词转换。

字体下载

根据上述方法制作了简转繁字体繁媛明朝

(作于 2020 年 7 月 31 日,修改于 2020 年 10 月 1 日)