#!/usr/bin/env python3 # -*- coding: utf-8 -*- """生成包含繁体'遠'的字体子集""" from fontTools.ttLib import TTFont from fontTools.ttLib.tables import _h_m_t_x, _g_a_s_p from fontTools.subset import Subsetter, Options # 修补表解析以跳过损坏的数据 original_hmtx = _h_m_t_x.table__h_m_t_x.decompile def patched_hmtx(self, data, ttFont): try: return original_hmtx(self, data, ttFont) except: self.metrics = {} _h_m_t_x.table__h_m_t_x.decompile = patched_hmtx original_gasp = _g_a_s_p.table__g_a_s_p.decompile def patched_gasp(self, data, ttFont): try: return original_gasp(self, data, ttFont) except: self.gaspRanges = {} _g_a_s_p.table__g_a_s_p.decompile = patched_gasp # 加载字体 font = TTFont('src/app/fonts/AoyagiReisho.ttf') # 删除损坏的表 for t in ['vmtx', 'gasp', 'VORG', 'mort', 'morx']: if t in font: del font[t] print(f'Deleted table: {t}') # 创建子集器 subsetter = Subsetter() options = Options() options.drop_tables = ['gasp', 'vmtx', 'VORG', 'mort', 'morx', 'GSUB', 'GPOS', 'GDEF'] subsetter.options = options # 目标字符: 睿(0x777f), 新(0x65b0), 致(0x81f4), 遠(0x9060), 空格(0x20) unicodes = [0x20, 0x777f, 0x65b0, 0x81f4, 0x9060] print(f'Target Unicode: {[hex(u) for u in unicodes]}') subsetter.populate(unicodes=unicodes) # 执行子集化 try: subsetter.subset(font) except Exception as e: print(f'Warning during subsetting: {e}') # 保存 output_path = 'src/app/fonts/AoyagiReisho-subset.ttf' font.save(output_path) font.close() print(f'Saved to: {output_path}') # 验证 verify_font = TTFont(output_path) cmap = verify_font.getBestCmap() chars = [chr(k) for k in sorted(cmap.keys())] codes = [hex(k) for k in sorted(cmap.keys())] print(f'Subset characters: {chars}') print(f'Unicode codes: {codes}') print(f'Contains U+9060 (遠): {0x9060 in cmap}') verify_font.close()