减少中文 WEB 字体体积的方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
malagebidi
V2EX    奇思妙想

减少中文 WEB 字体体积的方法

  •  
  •   malagebidi 2 天前 1696 次点击
    中文字体体积巨大,一般不用在 web 上,但我想到一种办法,为什么不把中文字按照偏旁部首一笔一划拆开呢?这样每个文字都可以组合出来了,体积最终大幅缩小
    27 条回复    2025-12-03 23:37:18 +08:00
    InDom
        1
    InDom  
       2 天前
    FSS(Font Style Sheets) 是吧?
    jydeng
        2
    jydeng  
       2 天前
    那组合字体的结构数据很大,我觉得区别不大
    xtreme1
        3
    xtreme1  
       2 天前
    然后只有 Word 能正确显示中文
    在 LaTeX 中输入中文需要先学一周
    penisulaS
        4
    penisulaS  
       2 天前
    大就大吧,现在似乎不那么在意体积了,以前做地图的时候,中文还需要做字体压缩啥的,只保留用到的字
    shintendo
        5
    shintendo  
       2 天前
    拆部首感觉不靠谱,同一部首在不同结构的字上也不一样,拆笔画就更扯了。

    退一万步讲,即使可行,我也很怀疑“体积大幅缩小”的结论。
    codehz
        6
    codehz  
       2 天前
    你不会是想说思源宋体的那种 辶穴月幺长言马幺长刂心 彩蛋吧,然而不幸的是,这玩意虽然看上去可组合,但实际上还是得自己一个个拼,虽然现在字体引擎能干的事挺多,比如能塞一个 wasm ,但拼文本这种活还是够呛
    gfwuzer
        7
    gfwuzer  
       2 天前
    Google font 上的字体貌似是按照频率拆分成了 100 多个文件。
    codehz
        8
    codehz  
       2 天前
    @penisulaS 笑死,字体 woff2 压缩下也就十几 M ,几个 js 加高清大图就瞬间几十 M 了(
    est
        9
    est  
       2 天前   1
    这个思路早就有人想了

    Unicode IDS Ideographic Description Sequences (表意文字描述序列)

    不支持一是需要操作系统增加复杂的渲染机制。

    二是造出来的字基本都很丑。。。。
    alphat
        10
    alphat  
       2 天前
    那浏览器渲染还需要单独处理了,还要做成标准规范等等,性价比太低了
    一般做法是以字为单位进行优化
    alphat
        11
    alphat  
       2 天前
    @codehz #8 你应该没听过雪碧图吧,有时就是为了省十几 K
    zsj1029
        12
    zsj1029  
       2 天前
    现在很多静态博客,根据文字内容,只打包出来用到的字体就小很多,如果是动态内容,就不要换中文字体了,除非是本地部署单机应用
    Razio
        13
    Razio  
       2 天前
    chrome 生成 PDF 的时候,就是按字拆出来的
    opengps
        14
    opengps  
       2 天前
    为什么要缩小体积?
    以往的理由是:网络不够快,硬盘不够大,内存不够大。。。现在这些都不是问题,为什么还要去压缩体积?
    mumu
        15
    mumu  
       2 天前
    不是有开源项目吗,支持根据你页面的文字,来动态生成 ttf ,就是仅保留你页面设计的文字,然后就体积小了
    DualVectorFoil
        16
    DualVectorFoil  
       2 天前   1
    请看 https://github.com/notofonts/noto-cjk-varco
    (题外话不知道为啥谷歌在上个月突然把 noto cjk 的字体归档了)

    如果是想在个人博客或者网站上使用中文,还可以考虑分包后按需加载 https://github.com/KonghaYao/cn-font-split
    Mithril
        17
    Mithril  
       2 天前
    不可行的。

    字体不是简单的偏旁部首拼到一起,那样字体根本没法用。做一套字体成本很高,主要是每个字想要好看,同时写成一句话以后重心统一,是需要手动调整的。

    比如“好”,“妙”,“如”这三个字,偏旁都一样,但你把“好妙如”放大看,它们这个女字旁的大小和位置都是不一样的(最终效果取决于你用的字体,或者你找在线的试一下,衬线字体尤为明显)。这个主要就是为了保证这些字单独看起来不会失去平衡,同时连在一起后中心也大致在一个水平线上。

    另外 hint 也没法弄。

    目前绝大多数的字体都是矢量字体,你可以认为里面保存的都是一些构成字形曲线的函数。真正显示出来,需要把这些东西渲染成点阵。就和游戏渲染差不多。
    这个过程中会根据每个字的 hint 进行微调。保证主要结构的位置,其它的会适当变形,让点阵结果看起来不会扭曲的很难看。

    简单拼凑偏旁部首的话,这些都没法解决。如果每个字都做单独调整,那和你现在的字体大小就没什么区别了。
    HADB
        18
    HADB  
       1 天前   2
    之前做了一个 font2svg 的方案: https://hadb.me/posts/2023/font2svg-solution
    公司内部用的,核心的部分已经开源 font2svg-api
    shadowyue
        19
    shadowyue  
       1 天前
    只把你用到的汉字打包成字体就行,有成熟方案
    maplezzz
        20
    maplezzz  
       1 天前
    现在比较常用的字体体积优化方案是基于文字的 unicode-range 懒加载所用的字体分包
    subframe75361
        21
    subframe75361  
       1 天前
    字体的偏旁部首的间距坐标等信息并不是固定的,考虑美观因素甚至同一个部首在不同字体中都会有不一样的形状,完整地处理下来体积不会小多少
    xinyu391
        22
    xinyu391  
       1 天前
    笔画字体,不是什么新鲜概念。
    其实现在字体早就有这种技术了,字体中一个字符,可以有多个轮廓组成,就是为了重用相同的轮廓。
    但现在字体 主要是未来美观, 用偏旁部首 组合,很难达到美观的程度。
    shunia
        23
    shunia  
       1 天前
    @HADB #17 好细的技术方案,非常优秀。

    但是我感觉这也太浪费了。既然都使用预编译方案了,那无论多少标签,直接把它们都预编译成对应的,只包含该标签文字内容的字体文件就好了,html 里引用对应标签的字体文件,在前端就可以没有任何代价的实现常规样式。即便标签内容是动态的,捕获新标签触发字体编译应该也很简单。做一个这么复杂的技术方案,相对于结果,代价太高,大炮打蚊子。
    colourfulsai
        24
    colourfulsai  
       1 天前
    说实话,不如直接用 CDN 加速的字体,只要别的网页标签打开过,你的网页直接用,都不用下载,找一个使用率较高的就行。要不就像上面说的,子集化字体/惰性加载。
    tsx8
        25
    tsx8  
       20 小时 9 分钟前
    @opengps 现在还是问题吧,个人博客加载自定义字体的速度还是很慢的
    opengps
        26
    opengps  
       18 小时 8 分钟前
    @tsx8 #25 这确实,但非要用几兆的字体,还不如直接用几个 kb 的图片代替
    darkengine
        27
    darkengine  
       17 小时 19 分钟前
    按字保存体积大,是空间换时间的思路。如果拆到笔画级别,你想想一篇文章要怎么保存,怎么渲染?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5273 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 08:57 PVG 16:57 LAX 00:57 JFK 03:57
    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