字体加密中的问题

场景:

aHR0cHMlM0EvL3d3dy54dWFuemhpLmNvbS96aGFvcGFpZ3VhL2RldGFpbC85YmEzYjE5Mi1lOWViLTRlNjAtOTVlYS1lNDcwOTI3N2FkOTE=

在以往处理的常规字体加密中获得到映射关系应该就是加密字体对汉字

但这个网站中得到的是如下关系 :

{'*#258': '质', '*#33': '休', '*#209': '的', '*#54': '具', '*#103': '天', '*#32': '价', ...}

xml文件中

在这里插入图片描述


问题描述

网页加载后响应的是汉字,和*#258这些字符串无法对应, 所以需要将它转为*#格式

观察xml文件发现code对应name

在这里插入图片描述

其中0x827a这种字符串是十六进制的数字,将十六进制转换成十进制int("0x827a",16)

而code的后四位就是汉字编码后的unicode

百度了一下, 读取cmap可以得到code和name的映射关系

font_map = font_parse['cmap'].getBestCmap()
print(font_map)
#{38656: '*#267', 24067: '*#78', 20998: '*#22', 19975: '*#223',...}

38656就是code, 打印出来自动转为十进制了

总结 :
我们要将 汉字 => unicode => 十六进制 => 十进制数字
再根据font_map的映射关系就可以对应上*#格式


解决方案:

汉字转数字代码 :

def conv(hanzi):
    try:
        uni = hanzi.encode('unicode-escape').decode()[2:]  # 827a
        num = int('0x'+uni,16)   # 33402
    except:
        print('错误转换',hanzi)
        return
    return num
    
conv('艺')  # 艺 => \u827a => 827a => 0x827a => 33402

部分参考 : https://blog.csdn.net/WanYu_Lss/article/details/83447174

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值