研究了一下Opentype才知道其实把一个大字符集的字体变「简入繁出」是根本不需要去拷贝字模的(当然,盟途黑没有纯简体的,所以也没办法)。
我先起个头,这其实可以按一个大Project来做,做出来的feature所有人都受益。我已在Google Code上建立了一个Project,名为Simp2Orth(简体转正体)
思路:
我先起个头,这其实可以按一个大Project来做,做出来的feature所有人都受益。我已在Google Code上建立了一个Project,名为Simp2Orth(简体转正体)
思路:
- 用Stylistic Alternates(花式替代字,salt)来解决「一对一」(盟途黑其实就是用繁体替换简体来实现「一对一」,这个在字体制作中可以称为「硬替换」,而使用salt来实现则是「软替换」<*注>)。
- 一对一的例子如「写→寫」,「头→頭」。
- 存在一对多的情况时,总还是得选一个基础对应,例如「发→發」。可以参考同文堂的转换选择。主要要注意是否有必要「优先转繁」,如做姓氏的「余」和剩余的「餘」就是比较尴尬的例子,按说「餘」用得更多,应该优先转繁,但如果要用calt来修复一个作姓氏的「余」,那难道把全国姓余的名字都列出来?于是只有不在salt中转繁,而是把「餘下、餘留、餘力、餘年、餘事、餘音、課餘、雪餘、五千有餘……」这些固有词汇给枚举出来。有些简体字,例如「丑」,它是简体字,但并不是生造出来的「简 化字」,只是跟「醜」(表ugly)字合并了,换句话说香港台湾同胞还是在用「丑」字表示「小丑」。只要不涉及戏剧,相对来说「醜」要更常用些,组合的词 汇也更多,这时优先转繁的代价会小一些。
- 相应的Fontlab Studio中代码为:
代码:feature salt {
sub uni5934 by uni982D; #「头→頭」
sub uni53D1 by uni767C; # 「发→發」
} salt;
- 只需要写个脚本就可以把上面那个同文堂的列表转换为feature代码。
- 用Contextual Alternates(上下文替代字,calt)来解决或者说修复一对多错误
- 一对多的例子如「头发」不应变「頭發」而是「頭髮」
- 这时就需要很大的词汇量来解决这个问题,而这也是核心问题。
- 同样,整理出词库后可以按特定格式写成词典,交给转换脚本转换成feature代码,形如:
代码:feature calt {
# DEFAULT
sub uni982D uni767C' by uni9AEE; # 頭發→頭髮
} calt;
- 两字同时需要替换的,要分两步走,如「秋千」→「鞦韆」,把前面替换过的再拿来给下一次用。
代码:sub uni79CB' uni5343 by uni97A6; #秋千→鞦千
sub uni97A6 uni5343' by uni97C6; #鞦千→鞦韆
- 上下文替换牵涉到相当复杂的语义学困境,关于描述简→繁转换的论文都有不少。例如:
「历」在一对一中变成「歷」,相应「歷史、歷經」这些词没有问题,但是「陽歷」错了应该是「陽曆」,于是用calt写一个规则把它改回去。于是「陽曆、太陽曆」变成正确的了,但是「太陽曆经幾十億年」这个语境下,又应该是「歷經」的「歷」,而「太陽曆經過四年一閏的修改後」這個語境下又是「曆」(漢語沒有空格,分詞很困難)……所以参与的人越多,做出来的feature也就越成熟。