网址:aHR0cDovL3h4ZmIubXdyLmNuL3NxX2RqZGguaHRtbA==
打开后F12发现字体都是乱码,不用想,肯定是加载了自定义的字体
把字体下载下来后加载看一下,都是正常的
解决思路:
先加载字体文件,然后遍历每一个字体,用OCR识别出来真实的文字,然后用一个字典建立映射关系,还原数据中的乱码
下面用fontTools
这个库来处理字体 pip install fontTools
转xml文件看一下
from fontTools.ttLib import TTFont
if __name__ == '__main__':
# 字体文件路径
font_file_path = 'Db9FdR8Zv3_1725640418447.ttf'
font = TTFont(font_file_path)
font.saveXML('font.xml')
fontTools
的一些操作
font.getGlyphOrder() # 返回一个字形名称列表,以其在文件中的顺序排序
font.getGlyphNames() # 返回一个字形名称列表,以字母顺序排序
font.getBestCmap() # 返回一个字形ID为键、字形名称为值的字典
font.getReverseGlyphMap() # 返回一个字形名称为键、字形ID为值的字典
font.getGlyphName(10000) # 输入字形ID返回字形名称
font.getGlyphID("uni70E0") # 输入字形名称返回字形ID
font.getGlyphSet() # 返回一个_TTGlyphSet对象,包含字形轮廓数据
这里以第41个字来举例
第41个字对应的name是glyph00040
下面用freetype-py
这个库将字画出来 pip install freetype-py
用ddddocr
这个库来识别字体 pip install ddddocr
import ddddocr
import matplotlib.pyplot as plt
from fontTools.ttLib import TTFont
from fontTools.pens.freetypePen import FreeTypePen
from io import BytesIO
from loguru import logger
ocr = ddddocr.DdddOcr(beta=True,show_ad=False)
if __name__ == '__main__':
font_file_path = 'Db9FdR8Zv3_1725640418447.ttf'
font = TTFont(font_file_path)
# 实例化Pen子类
pen = FreeTypePen(None)
glyph00038 = font.getGlyphSet()['glyph00040']
glyph00038.draw(pen)
pen.show()
byteArray = pen.array()
buffered = BytesIO()
plt.imshow(byteArray)
plt.axis('off')
plt.savefig(buffered, format='PNG')
ocrResult = ocr.classification(buffered.getvalue())
glyph_table = font.getReverseGlyphMap()
glyph_table = font.getBestCmap()
for code,glyph_id in glyph_table.items():
if glyph_id == 'glyph00040':
logger.info('{} ====> {}'.format(chr(code),ocrResult))
break
这样就成功把glyph00040
对应的乱码给还原了
最终成品效果: