可以看到字体是一个个的框,用了自定义的字体文件。
源码中是这样显示的:
字体文件下载到本地,安装FontCreator以后打开来看看,是这样的:
很容易看出来源码中的是uniee22
接下来就是编码和字符之间的对应关系,这一步需要人工录入它们之间的对应关系(PS:一个偷懒的办法是在FontCreator中打开字体文件,复制unicode编码,然后隐藏unicode,把字符图片截屏,用在线识图OCR工具识别出来,粘贴在一起,比一个个录入快多了)。
但是,字体文件会变化,这个编码对应关系可能下次就对不上了,怎么办?
先来看看字体文件到底是个什么东西。
用fontTools把woff格式的字体文件转换为xml文件,
from fontTools.ttLibimport TTFont
font = TTFont('3f219bb4.woff') # 打开本地字体文件3f219bb4.woff
font.saveXML('local.xml') # 将ttf文件转化成xml格式并保存到本地,主要是方便我们查看内部数据结构
可以看到,相当于每个unicode编码对应一幅图,字符是画出来的,以下是点阵中的坐标
所以字体编码虽然变化,但是字的写法是不变的,也就是它所对应的一系列x,y坐标参数是不变的。
然后可以在本地写上当前unicode和字符的对应关系,再把网页中的unicode对应的坐标与本地的作比较,从而得出其对应的字符。
# 比较两个编码对应的坐标是否相同
def compare(l1,l2):
if(len(l1)!=len(l2)):
return False
else:
mark= 1
for iin range(len(l1)):
if abs(l1[i][0]-l2[i][0])<40 and abs(l1[i][1]-l2[i][1])<40:
pass
else:
mark=0;
break
return mark
#传入网页的字体文件路径和要解析的编码字符,返回解码字符
def getString(fontpath,code):
# 手动确定编码和字符的对应关系
u_list= ['unied12', 'unie998', 'uniedc9', 'uniefe9', 'unif280', 'unie200', 'uniefaf', 'unif1ec', 'unie728',
'unif008', 'unieeec', 'uniecfc', 'unif682', 'uniec45', 'unif1d9', 'unie30d', 'unie319', 'unif08b',
'unif3c3', 'uniea07', 'uniea37', 'uniea39', 'uniec5a', 'unif88b', 'unief34', 'unieaad', 'uniedb2',
'unieec2', 'unie6c9', 'unie4ff', 'unif50f', 'unie32d', 'unie568', 'unied32', 'unif89d', 'unif2c6',
'unie1a6', 'unie1df', 'unif14f', 'uniefb3', 'unif343', 'unie099', 'unieb02', 'unie029', 'unieb43',
'uniebb3', 'unie210', 'unie303', 'unief92', 'unif0fa', 'unie614', 'unie5eb', 'uniea70', 'unif64b',
'unie2b2', 'unie73d', 'unie0c9', 'unie810', 'unif084', 'unie765', 'unie1d6', 'unie4f4', 'uniec47',
'unie231', 'unif5f3', 'unif4db', 'unif454', 'uniebeb', 'uniee93', 'unie251', 'unif0cc', 'uniecc7',
'unie4ba', 'unieeb8', 'unif50a', 'unif00b', 'unie36b', 'unif308', 'unief72', 'unie2ec', 'unieed3',
'unie5cf', 'unif801', 'unif37d', 'unie84a', 'uniedb6', 'unied22', 'unie938', 'uniee20', 'unie77f',
'uniec02', 'unieee7', 'unif4dc', 'unie5f5', 'unif7b0', 'unie9c5', 'unie822', 'unif7aa', 'unif493',
'unie013', 'unif022', 'unie286', 'unieff9', 'uniebb1', 'unief9c', 'unie793', 'unie885', 'unif693',
'uniecf5', 'unie8e3', 'unif09e', 'unie26b', 'unie1ea', 'unied28', 'unie7b9', 'unif527', 'unieeee',
'unieb34', 'uniebc0', 'unie734', 'unif6c4', 'uniecd5', 'unie71f', 'unie328', 'uniefdc', 'unie5ea',
'unie15c', 'unif843', 'unif002', 'unie841', 'unie8d1', 'uniefb4', 'unie949', 'unif06d', 'uniec78',
'unie10b', 'unif54d', 'unif8b2', 'unif273', 'unie69d', 'uniebf7', 'unif108', 'unie278', 'unie3ed',
'unif853', 'unieac3', 'unif57f', 'unif160', 'unif484', 'unif6dc', 'unief8c', 'uniee17', 'unief78',
'unif242', 'unif5ef', 'unif688', 'unie415', 'unie963', 'unieacf', 'unie4a9', 'unif15b', 'unif0dc',
'uniee5b', 'unie184', 'unieb6e', 'unif1ba', 'unie41b', 'unif013', 'unieab7', 'unif074', 'unie584',
'uniebd2', 'unif3fa', 'uniea53', 'unif611', 'unie29a', 'unieebc', 'unie993', 'unie271', 'unif389',
'unie19e', 'uniee6d', 'uniec20', 'unif052', 'unif6fa', 'unif6e2', 'unie9bc', 'unie9d1', 'unif7ec',
'unif140', 'uniee56', 'unie724', 'unie2b7', 'unie596', 'unif8db', 'unie8ba', 'unif2bb', 'unie351',
'unieca5', 'unie6a9', 'unif504', 'unied4e', 'unif4ad', 'unie641', 'unieaa2', 'unie12a', 'unie1fb',
'unie49b', 'unie424', 'unie52a', 'unieda4', 'unief74', 'unif6c9', 'unif5e5', 'unie338', 'unie408',
'unie682', 'unie82c', 'unie926', 'unie5d2', 'unie060', 'unie927', 'unie0e5', 'uniee7a', 'unif128',
'unie7a9', 'unie2d7', 'unif7f6', 'unif425', 'unie6d8', 'unif579', 'unif808', 'unie83e', 'unif63b',
'uniec33', 'unie4e9', 'unie6c0', 'unief32', 'unieb2f', 'unie6f5', 'unie4e2', 'unif820', 'unif121',
'unie809', 'unif56c', 'unie909', 'unif193', 'unie8ab', 'unieb3a', 'unif1a7', 'unie562', 'unif18f',
'unie6ed', 'unif885', 'unieca4', 'unif422', 'unif212', 'unief86', 'unie18f', 'unie7c8', 'unif55f',
'unif28f', 'unif443', 'unie1e2', 'unif391', 'unif4e0', 'uniea09', 'unie866', 'unied8d', 'unie9e4',
'unie28a', 'unie989', 'unif804', 'unif344', 'unief05', 'unie9a1', 'unie0be', 'unie341', 'unie1a9',
'unie0a5', 'unif507', 'unif8b0', 'unie48f', 'unie7e0', 'unif0a6', 'unie8b2', 'unif740', 'uniee4a',
'unie68f', 'unie683', 'unie746', 'unif099', 'unif252', 'unie119', 'unif720', 'unie0fb', 'unief65',
'unie2c3', 'unied62', 'unief1e', 'uniebe9', 'unie2d9', 'unie31b', 'unif6f8', 'unie499', 'unif1f1',
'unif656', 'unieb46', 'unie7d5', 'unie9a9', 'unie9ff', 'unie6f3', 'unie729', 'unie90c', 'unie2f4',
'unie145', 'unie3e9', 'unie8e8', 'unief0c', 'unif27f', 'unie441', 'unif435', 'uniebee', 'unif70e',
'unie633', 'unif6aa', 'uniebb9', 'unie8c1', 'unie713', 'unie220', 'unif077', 'uniebe4', 'unie9c6',
'unie67c', 'unif8a0', 'unif671', 'unif408', 'unif88f', 'unif228', 'unief52', 'unif2fb', 'unieb36',
'unie7ea', 'unie93c', 'unie64d', 'unif68f', 'uniea4c', 'unie6e4', 'unie1b2', 'unie508', 'unif4dd',
'unie00e', 'unie0a8', 'unie2a9', 'unif4a2', 'uniec73', 'uniee11', 'unif307', 'unif5da', 'unie6cd',
'unieae2', 'unif23d', 'unie5b1', 'unie1db', 'unieb24', 'unie9e7', 'uniec93', 'unif857', 'unie020',
'unie0af', 'unie78b', 'unif247', 'unie451', 'unif2cd', 'unie06e', 'unie414', 'unie775', 'unie5db',
'unif7ab', 'unie75a', 'unie6bb', 'unif852', 'unif6b9', 'uniea1a', 'unie96d', 'unieb44', 'unif59b',
'unie8a8', 'unie9f7', 'unif465', 'unif345', 'unieebb', 'unif264', 'unie9b2', 'unif095', 'unie88c',
'uniebc9', 'unie28c', 'uniec98', 'unie006', 'unif4c5', 'unie042', 'unie314', 'unie26c', 'unie113',
'unieb8e', 'uniee3f', 'unie7b6', 'unif5ea', 'unif65c', 'unif81b', 'unie752', 'unif13a', 'unie7c4',
'unie35a', 'unie69e', 'unif7d5', 'unif69a', 'unif5ba', 'unie5dc', 'unif5e6', 'unie600', 'unieaa1',
'unie5ec', 'unie0f4', 'unif3b8', 'unie607', 'unif127', 'unied7a', 'unif2c8', 'unie9d3', 'unie5e8',
'unief53', 'unied74', 'unieb7f', 'uniefb0', 'unie7f3', 'unie5a4', 'unie379', 'unie43b', 'uniee18',
'unif00a', 'unie2a7', 'unif5ab', 'unied11', 'uniea62', 'unif651', 'unie253', 'unif8ec', 'unif78f',
'unif3e0', 'uniee49', 'unie496', 'unieced', 'unif8a1', 'unif5a5', 'unif02a', 'uniebc3', 'uniec0d',
'unie37c', 'unie2e3', 'unie1e6', 'unie1dc', 'unieece', 'unie9b8', 'unie8a0', 'unif53d', 'unie4b3',
'unif4a1', 'unif7c9', 'unif26e', 'uniee48', 'unif5e1', 'unie771', 'unif67f', 'unie5dd', 'unie69f',
'unif2ea', 'unif27e', 'uniecfb', 'unif811', 'unie92a', 'unif8c6', 'unie7fa', 'unie083', 'unie754',
'unief15', 'unie0b8', 'unie0f9', 'unif2b2', 'unie9e9', 'unif224', 'unie144', 'unif08a', 'unif7ff',
'unif5f4', 'unif342', 'unie0ea', 'unieb99', 'uniefbc', 'unif6a4', 'unie6aa', 'unie005', 'unif3bf',
'unif365', 'unie4f9', 'unie81e', 'unie911', 'unied0f', 'unif187', 'unie71a', 'unie824', 'unie566',
'unif125', 'unie8d3', 'unif54f', 'unif4b0', 'unif6d1', 'unie8a4', 'unif402', 'unie6fb', 'unif4e2',
'unied7e', 'unif7d9', 'unie964', 'unieffb', 'unie5a0', 'unif637', 'unie17a', 'unif4b5', 'unif0f3',
'unif2c9', 'unie336', 'unie75e', 'unie4b8', 'unieb8a', 'uniebca', 'unif183', 'unie843', 'unif888',
'unif796', 'unie239', 'unie3ec', 'unie5ca', 'unie1a8', 'unieb94', 'unie443', 'unie946', 'unif760',
'unif791', 'unif815', 'unief61', 'unif07d', 'unie3b3', 'unif36f', 'unif021', 'unie0d5', 'unif1b6',
'unief14', 'unieb55', 'unif3cb', 'unif788', 'unie672', 'unie6e5', 'unieacb', 'unieb04', 'unif473',
'unif624', 'unie14b', 'unie96c', 'unie762', 'unied05', 'unif58f', 'unif225', 'unif0eb', 'unie32f',
'unie6dc', 'unie86c', 'unie974', 'unieba0', 'unif583', 'unie3b1', 'unie098', 'uniede4', 'unie575',
'unif6ad', 'unif634', 'unif72f', 'unif4b8', 'unif5d2', 'unif771', 'unif5e7', 'uniec7a', 'unif7e8',
'unie077', 'unif056', 'unif066', 'unie506', 'unie0a3', 'unif520', 'unie819']
word_list= ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '店', '中', '美', '家', '馆', '小', '车', '大', '市', '公',
'酒', '行', '国', '品', '发', '电', '金', '心', '业', '商', '司', '超', '生', '装', '园', '场', '食', '有', '新', '限',
'天', '面', '工', '服', '海', '华', '水', '房', '饰', '城', '乐', '汽', '香', '部', '利', '子', '老', '艺', '花', '专',
'东', '肉', '菜', '学', '福', '饭', '人', '百', '餐', '茶', '务', '通', '味', '所', '山', '区', '门', '药', '银', '农',
'龙', '停', '尚', '安', '广', '鑫', '一', '容', '动', '南', '具', '源', '兴', '鲜', '记', '时', '机', '烤', '文', '康',
'信', '果', '阳', '理', '锅', '宝', '达', '地', '儿', '衣', '特', '产', '西', '批', '坊', '州', '牛', '佳', '化', '五',
'米', '修', '爱', '北', '养', '卖', '建', '材', '三', '会', '鸡', '室', '红', '站', '德', '王', '光', '名', '丽', '油',
'院', '堂', '烧', '江', '社', '合', '星', '货', '型', '村', '自', '科', '快', '便', '日', '民', '营', '和', '活', '童',
'明', '器', '烟', '育', '宾', '精', '屋', '经', '居', '庄', '石', '顺', '林', '尔', '县', '手', '厅', '销', '用', '好',
'客', '火', '雅', '盛', '体', '旅', '之', '鞋', '辣', '作', '粉', '包', '楼', '校', '鱼', '平', '彩', '上', '吧', '保',
'永', '万', '物', '教', '吃', '设', '医', '正', '造', '丰', '健', '点', '汤', '网', '庆', '技', '斯', '洗', '料', '配',
'汇', '木', '缘', '加', '麻', '联', '卫', '川', '泰', '色', '世', '方', '寓', '风', '幼', '羊', '烫', '来', '高', '厂',
'兰', '阿', '贝', '皮', '全', '女', '拉', '成', '云', '维', '贸', '道', '术', '运', '都', '口', '博', '河', '瑞', '宏',
'京', '际', '路', '祥', '青', '镇', '厨', '培', '力', '惠', '连', '马', '鸿', '钢', '训', '影', '甲', '助', '窗', '布',
'富', '牌', '头', '四', '多', '妆', '吉', '苑', '沙', '恒', '隆', '春', '干', '饼', '氏', '里', '二', '管', '诚', '制',
'售', '嘉', '长', '轩', '杂', '副', '清', '计', '黄', '讯', '太', '鸭', '号', '街', '交', '与', '叉', '附', '近', '层',
'旁', '对', '巷', '栋', '环', '省', '桥', '湖', '段', '乡', '厦', '府', '铺', '内', '侧', '元', '购', '前', '幢', '滨',
'处', '向', '座', '下', '県', '凤', '港', '开', '关', '景', '泉', '塘', '放', '昌', '线', '湾', '政', '步', '宁', '解',
'白', '田', '町', '溪', '十', '八', '古', '双', '胜', '本', '单', '同', '九', '迎', '第', '台', '玉', '锦', '底', '后',
'七', '斜', '期', '武', '岭', '松', '角', '纪', '朝', '峰', '六', '振', '珠', '局', '岗', '洲', '横', '边', '济', '井',
'办', '汉', '代', '临', '弄', '团', '外', '塔', '杨', '铁', '浦', '字', '年', '岛', '陵', '原', '梅', '进', '荣', '友',
'虹', '央', '桂', '沿', '事', '津', '凯', '莲', '丁', '秀', '柳', '集', '紫', '旗', '张', '谷', '的', '是', '不', '了',
'很', '还', '个', '也', '这', '我', '就', '在', '以', '可', '到', '错', '没', '去', '过', '感', '次', '要', '比', '觉',
'看', '得', '说', '常', '真', '们', '但', '最', '喜', '哈', '么', '别', '位', '能', '较', '境', '非', '为', '欢', '然',
'他', '挺', '着', '价', '那', '意', '种', '想', '出', '员', '两', '推', '做', '排', '实', '分', '间', '甜', '度', '起',
'满', '给', '热', '完', '格', '荐', '喝', '等', '其', '再', '几', '只', '现', '朋', '候', '样', '直', '而', '买', '于',
'般', '豆', '量', '选', '奶', '打', '每', '评', '少', '算', '又', '因', '情', '找', '些', '份', '置', '适', '什', '蛋',
'师', '气', '你', '姐', '棒', '试', '总', '定', '啊', '足', '级', '整', '带', '虾', '如', '态', '且', '尝', '主', '话',
'强', '当', '更', '板', '知', '己', '无', '酸', '让', '入', '啦', '式', '笑', '赞', '片', '酱', '差', '像', '提', '队',
'走', '嫩', '才', '刚', '午', '接', '重', '串', '回', '晚', '微', '周', '值', '费', '性', '桌', '拍', '跟', '块', '调',
'糕']
# 读取本地的字体文件
font1= TTFont("22e96dba.woff")
be_p1= []
for uniin u_list:
p1= [] # 保存一个字符的x,y信息
# 获取对象的x,y信息,返回的是一个GlyphCoordinates对象,可以当作列表操作,每个元素是(x,y)元组
p= font1['glyf'][uni].coordinates
# 把GlyphCoordinates对象改成一个列表
for fin p:
p1.append(f)
be_p1.append(p1)
# 读取当前网页的字体文件,已经下载到本地了
font2= TTFont(fontpath)
uni_list2= font2.getGlyphOrder()[1:]
on_p1= []
for iin uni_list2:
pp1= []
p= font2['glyf'][i].coordinates
for fin p:
pp1.append(f)
on_p1.append(pp1)
n2= 0
x_list= []
# 字典,当前unicode编码和字符对应关系
code_dict= {}
for din on_p1:
n2+= 1
n1= 0
for ain be_p1:
n1+= 1
if compare(a, d):
print(uni_list2[n2- 1] + "=" + word_list[n1- 1])
code_dict[uni_list2[n2- 1]] = word_list[n1- 1]
x_list.append(word_list[n1- 1])
# 返回对应的真实字符
return code_dict[code]
参考链接:https://blog.csdn.net/xing851483876/article/details/82928607