根据自定义汉字集给字体库减肥,生成新字库
类别: 入门到放弃
标签: Python 字库集
日期: 2023-12-06 | 作者:admin | 浏览: 49

前几天逛Github时候,看到个NES.css(NES.CSS)挺好玩的,就想着后续可以用在自己的小站上。下载测试了下,但发现中文字体不协调,然后用了下推荐的Zpix(Zpix最像素),顺眼多了,但就是字体库实在太大了,用网上推荐的转换成.woff2文件,也还有2M多,太不舒服了。字库查看了,包含2w多的汉字,属实过于奢侈,继续找攻略精简下。发现有个fontTools的库,可以各种自定义所需字体库,记录下。期间顺便去了解了GB2312和《通用规范汉字表》,发现GB2312的一类字或者《通用规范汉字表》的一级字库都够日常使用了,也就3500左右的量,转完woff2,也就200k不到,满足需求。

CSS中引入字体并全局使用


@font-face {
    font-family: "zpix";
    src: url("../fonts/zpix.woff2") format("woff2");
}

* {
    font-family: "zpix", "Microsoft YaHei", sans-serif;;
    font-size: 14px;
}

获取汉字的unicode编码


# ord() 返回相应的unicode编码
# hex() 转换成16进制
>>>print(hex(ord("一")))
0x4e00

fontTools小试牛刀


from fontTools import ttLib, subset


# 原始字库
font = ttLib.TTFont('zpix.ttf')
font_list = []

# 由于zpix的字符集是以uni开头,且后四位都是大写,例如汉字“一”在此字库的unicode编码为“uni4E00”
# 此处demo.txt文本内容为所需的自定义字库集(已包含字母及特殊符号等)的unicode编码集,仅以,分隔,例如:uni4E00,uni4E01,uni4E02...

with open('demo.txt', 'r', encoding='utf-8') as f:
    font_list = f.read().split(',')

# 根据unicode列表获取字库中的字符ID集
name_IDs = font.getGlyphIDMany(font_list)
sb = subset.Subsetter()
sb.populate(gids=name_IDs)
sb.subset(font)

# 输出新字符集,后续转换成woff2格式(包含4E00之前的英文字母、特殊符号等等),
# 3500字差不多180K左右,6000字的280K左右
subset.save_font(font, 'demo.ttf', subset.Options())
font.close()

 

<