帮忙研究个 ttc 转 ttf 的脚本问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bitinn
V2EX    Python

帮忙研究个 ttc 转 ttf 的脚本问题

  •  
  •   bitinn
    bitinn 2015 年 6 月 24 日 7945 次点击
    这是一个创建于 3878 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我之前一直用这段脚本将TrueType Collection分割为独立的TrueType文件进行测试。



    包括最近出来的苹方,见我早前写的介绍文: http://bitinn.net/11280/

    但今天弄苹方的更新版(刚发布的苹果OS X El Capitan Developer Preview Beta 2里),发现脚本计算内含字体数量的计数是错误的,本来只有12个字体(简繁各6个),现在却变成了24个。

    DP1下是没问题的。肯定脚本或字体哪里不对,但我python和字体格式的理解不深,无法排错。请高手分析。

    PS:如果需要测试字体,请用这个提取版。字体版权问题大家心里清楚,这里仅作为研究使用。

    https://twitter.com/lovegoodbest/status/613561129025966081
    13 条回复    2015-06-25 18:24:55 +08:00
    bitinn
        1
    bitinn  
    OP
       2015 年 6 月 24 日
    补充下,问题肯定在L33-L35,但我看了半天TrueType Collection spec也没搞清楚苹果是怎么给ttc加入font name的。换而言之,ttc允许你给一个ttf字体多个名字,例如萍方就附带了.PingFang和PingFang共24个字体名,但实际上只有12个字体文件……
    Daniel65536
        2
    Daniel65536  
       2015 年 6 月 24 日
    其实脚本的计算没有出错。
    你可以参考: https://www.microsoft.com/typography/otspec/otff.htm

    简单来说,这个ttc确实定义了24个otf,也确实包含24个otf,相对应的每两个otf的表的offest与length是相同的,除了这些字体的name表。

    两个字体在ttc中共用了大部分文件内容,但是分别使用了两个name表,字体名称就是在name表中定义的。
    janxin
        3
    janxin  
       2015 年 6 月 24 日
    字体的zip下载了两次都是压缩包错误,是我的网络问题还是压缩问题...
    Daniel65536
        4
    Daniel65536  
       2015 年 6 月 24 日
    唔,我又具体看了下每个表的情况,好像字体只是共用了BASE表(offset相同),不过其他除了name表内容确实是相同的。

    修正下上面的说法:

    这个ttc包含了24个otf,也确实有24个otf,带点不带点的字体在ttc中是两个字体,带点的字体会在字体册中隐藏,所以你只看到了12个字体,但是文件中确实是有24个字体的,虽然每组字体中差的也就是name表。
    bitinn
        5
    bitinn  
    OP
       2015 年 6 月 24 日
    @Daniel65536 我后来观察到了这个情况,但有几点不能理解:

    1. 含有24个字体的DP2版只比含有12个字体的DP1版多了几百K,TTC用了什么压缩方式吗?否则它是怎么做到的?
    2. 用这个脚本解DP1和DP2的字体,前者的表是正常的,后者似乎丢失了一些数据,导致我无法用opentype.js打开。具体错误见我发的文章里的更新。
    bitinn
        6
    bitinn  
    OP
       2015 年 6 月 24 日
    @janxin 我想相信是网络问题,我就是从那里下的,我自己都还没下好DP2……
    Daniel65536
        7
    Daniel65536  
       2015 年 6 月 24 日 via iPad
    @bitinn ttc没有带压缩,不过ttc可以把不同字体的表指向相同的offset来节约空间。比如带点不带点的字体的字形是一样的,所以对应的表可以只在ttc后面放一份,然后在前面Offset Table里写上相同的offset。
    至于脚本,有可能是因为这种offset相同导致出现奇怪的问题。
    至于是不是真是这样,我得先下载DP1的ttc看看到底是不是,不过现在比较忙,估计明天下午才能搞定,到时候大概会把研究结果丢到themex顺便往mai3上的前端群组丢一份吧,v2ex这边传图实在是不方便啊。
    ratazzi
        8
    ratazzi  
       2015 年 6 月 24 日
    为什么不用 fontforge 搞定
    Daniel65536
        9
    Daniel65536  
       2015 年 6 月 25 日
    @bitinn opentype.js还没有具体研究,不过fonttools对于DP2的处理是没有问题的,恐怕这和opentype.js中可能存在的bug有关。
    如果要具体研究字体还是推荐用fonttools里的pyftinspect或是ttx比较妥当。
    bitinn
        10
    bitinn  
    OP
       2015 年 6 月 25 日
    @Daniel65536 哦,你的意思是ttc2ttf没bug,解出来的ttf字体没错?这超出了我的预期(虽然我最初是准备上个issue给他们)。
    bitinn
        11
    bitinn  
    OP
       2015 年 6 月 25 日
    开了issue,静待官方回复 https://github.com/nodebox/opentype.js/issues/139

    或许我该去用fonttools,之前用opentype.js也是因为它比较多web interface,方便啊(不用上传文件,在客户端用JS分析本地文字)。
    Daniel65536
        12
    Daniel65536  
       2015 年 6 月 25 日
    研究结果见: http://bbs.themex.net/showthread.php?t=16903866

    fonttools就是个完美的本地工具,pyftinspect自带GTK界面,其他的工具都是命令行程序。

    另外Mac可以用
    brew install https://raw.githubusercontent.com/blackgear/homebrew-formula/master/fonttools.rb
    来装fonttools
    bitinn
        13
    bitinn  
    OP
       2015 年 6 月 25 日   1
    我用opentype.js理由是这个 http://bluejamesbond.github.io/CharacterMap/

    不受平台限制,也不用安装东西。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4312 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 09:28 PVG 17:28 LAX 01:28 JFK 04:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86