ayaka14732 / FanWunMing

A Simplified-Chinese-to-Traditional-Chinese font based on GenYoMin, which can handle the one-to-many problem | 繁媛明朝是基於源樣明體開發的簡轉繁字型,能處理一簡對多繁
SIL Open Font License 1.1
225 stars 12 forks source link

使用 substition 替换? #2

Open NightFurySL2001 opened 3 years ago

NightFurySL2001 commented 3 years ago

(以下为聊天摘录) 不错的字体,很实用。以下为另外一种方式的理论。

在单纯简转繁时,没有必要使用伪字图。两岸翻译差异有必要使用伪字图,但是如果是一个字在不同语境下,使用context可能会比较好点。建立一些Group,通过上下文检测来sub字,能够节省很多字形位置。上下文检测其实很常用,比如谚文拼接跟蒙文都是使用上下文检测替换。

例字:“发”的码位是“發”字,Group 1放[头 白 黑],Group 2是[发],当Group 2 前面是Group 1时,将“發”替换成“髮”。不同context可以在同一个sub table里面,优先级一样,如果不一样就可以拆分优先级。比如遇上“上头发的指令”,可能可以在sub group context前面加上ignore [上][头]之类的跳换。

ayaka14732 commented 3 years ago

谢谢!我还是不太清楚怎样实现,特别是对应关系比较复杂的情况。另外,这种方法与「正向最长匹配」算法是不是等价的呢?

NightFurySL2001 commented 3 years ago

OpenType 替换功能可参考 http://opentypecookbook.com/;本计划可用请见:http://opentypecookbook.com/rules/#substitutions-and-positioning-based-on-context

OpenType 替换功能的做法为从头开始往下进行,遇到可替换字后自动替换跳出循环。理论上只要你根据长度排序即可与正向最长匹配等价。 如:

feature ccmp{ //全替换
    sub f f i by f_f_i 
    sub f i  by f_i
} ccmp;

输入 office 会替换成 o(f_f_i)ce 而非 of(f_i)ce 同理,

feature ccmp{
    sub [头 白 黑] 发' by 髮 //[头 白 黑]指任意一个字,仅替换带 ' 的字母
    sub 发  by 發
} ccmp;

遇上 头发 会替换成 头髮发财 则变成 發财

以上功能英文查询为 contextual substitution。

当然,这样的简繁替换还是会有一定难度,但是因为仅仅是在glyph层进行,因此可以不用使用这么多伪字图。(当然,中台用词不同的词还是需要伪字图,这个逃不了)