繁體中文版,同时发布于知乎:正确实现简转繁字体 - 三日月 綾香的文章
简转繁字体是将简体文本以繁体字显示的字体。对于习惯阅读繁体字的用户,在某些没有简繁转换的平台(如电子书阅读设备),可以利用简转繁字体将简体文本以繁体字显示,从而减轻阅读时的负担。
然而,现有的简转繁字体是简单地将简体字的码位对应繁体字形,不能处理简体字与繁体字之间存在的「一简对多繁」现象,因此使用效果并不理想,也使许多人产生了「字体不能正确处理简转繁」的错误印象。
事实上,目前通行的 OpenType 字体格式提供了大量字体特性。使用其中的 GSUB(glyph substitution,字图替换)规则,可以实现能处理「一简对多繁」的简转繁字体。
本文介绍了简繁转换工具 OpenCC 与 OpenType 字体的 GSUB 规则,并介绍了将二者结合,在字体层面实现简繁转换的方法。利用同一方法,也可以实现能处理多音字的拼音字体及注音字体。
「一简对多繁」是指一个简体字对应多个繁体字的现象。例如,简体字「后」同时对应「後」(後面)与「后」(太后)两个繁体字。
由于「一简对多繁」现象,在简转繁时需要考虑上下文。
OpenCC 是开源的中文简繁转换工具,可以利用词语处理「一简对多繁」现象。
OpenCC 词库除了定义单字的简繁对应关系外,还定义了数万个词语的简繁对应关系。OpenCC 程序运行时根据「正向最大匹配」算法匹配文章中的简体词语,然后转换为繁体。
例如,在转换句子「太后的头发很干燥」时,程序根据词库中存在的词语,从左至右依次匹配「太后」、「的」、「头发」、「很」、「干燥」,然后分别转换为「太后」、「的」、「頭髮」、「很」、「乾燥」。
OpenType 字体提供了 GSUB 规则,用于替换字体中的字图。
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 的简繁转换算法相同,因此二者是等效的。
简转繁不可能做到完全准确。例如「时间不准差一分钟」这个句子本身存在歧义,对应的繁体既可能是「時間不準差一分鐘」(不准确),也可能是「時間不准差一分鐘」(不允许)。
「正向最大匹配」算法存在一定的局限性。例如,对句子「拥有 116 年历史」执行正向最大匹配,当匹配到「年」时,由于「年历」是一个词,会被匹配,从而错误地转换为「擁有 116 年曆史」;正确的写法应该为「擁有 116 年歷史」。
OpenCC 词库不可能囊括所有词语,例如新词不一定能及时收录于 OpenCC 词库中。
在上述方法中,一条简繁词语的对应关系需要使用一个伪字图,而伪字图也会占据字图数量。OpenType 字体的字图数量上限为 65535 个。
为了防止字图数量超过上限,可以采取两种方法:
第一:可以从字体中删除一些生僻字的字图。
第二:可以适当删除一些简繁词语的对应关系。应优先删除繁简同形、且在逐字转换时不会产生错误的词语,例如上面例子中的「播出」。
OpenType 字体提供了 trad 特性。在排版引擎中打开 trad 特性时,字体可以将简体字显示为对应的繁体字。但是,目前支持 trad 特性的字体并不多。
只要将上述替换表放入字体的 trad 表中,就可以制作支持 trad 特性、且能处理「一简对多繁」的字体。
OpenCC 支持中国大陆、台湾、香港的习惯用字和用词转换。如果在上述简繁词语的对应关系中加入地区字词的对应关系,就可以处理不同地区的字词转换,例如将「内存」轉換為「記憶體」。
另外,OpenType 字体可以根据语言指定不同的替换表。只要根据 OpenCC 词库,在 ZHS
, ZHT
, ZHH
表中指定不同的替换表,就可以使同一字体在不同语言环境下使用不同的字词转换。
根据上述方法制作了简转繁字体繁媛明朝。
(作于 2020 年 7 月 31 日,修改于 2020 年 10 月 1 日)