Quantcast
Channel: 极限社区 - 字体交流
Viewing all articles
Browse latest Browse all 2498

交流 【研究】利用Opentype Features把字体「简入繁出」

$
0
0
研究了一下Opentype才知道其实把一个大字符集的字体变「简入繁出」是根本不需要去拷贝字模的(当然,盟途黑没有纯简体的,所以也没办法)。

我先起个头,这其实可以按一个大Project来做,做出来的feature所有人都受益。我已在Google Code上建立了一个Project,名为Simp2Orth(简体转正体)

思路:
  1. 用Stylistic Alternates(花式替代字,salt)来解决「一对一」(盟途黑其实就是用繁体替换简体来实现「一对一」,这个在字体制作中可以称为「硬替换」,而使用salt来实现则是「软替换」<*注>)。
    • 一对一的例子如「写→寫」,「头→頭」。
    • 存在一对多的情况时,总还是得选一个基础对应,例如「发→發」。可以参考同文堂的转换选择。主要要注意是否有必要「优先转繁」,如做姓氏的「余」和剩余的「餘」就是比较尴尬的例子,按说「餘」用得更多,应该优先转繁,但如果要用calt来修复一个作姓氏的「余」,那难道把全国姓余的名字都列出来?于是只有不在salt中转繁,而是把「餘下、餘留、餘力、餘年、餘事、餘音、課餘、雪餘、五千有餘……」这些固有词汇给枚举出来。有些简体字,例如「」,它是简体字,但并不是生造出来的「简 化字」,只是跟「醜」(表ugly)字合并了,换句话说香港台湾同胞还是在用「丑」字表示「小丑」。只要不涉及戏剧,相对来说「醜」要更常用些,组合的词 汇也更多,这时优先转繁的代价会小一些。
    • 相应的Fontlab Studio中代码为:
      代码:

      feature salt {
        sub uni5934 by uni982D;  #「头→頭」
        sub uni53D1 by uni767C; # 「发→發」
      } salt;

    • 只需要写个脚本就可以把上面那个同文堂的列表转换为feature代码。
  2. 用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也就越成熟。
<*注>:Opentype Features需要软件的支持,貌似calt功能在很多软件中默认开启而salt则不开启,正在想解决办法。Photoshop,Illustrator和Firefox都支持默认开启calt,Win7的记事本也支持,郁闷的是Word 2010不支持calt(我明明在网上看到说支持的)。但如果salt不能默认打开,则只有设计软件可以手动打开,而浏览器则无法享受到这个功能——不知道什么时候可以从操作系统层面上控制Opentype Features的开关啊?

Viewing all articles
Browse latest Browse all 2498

Trending Articles