场景:
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