今天,我们来谈谈当我们得到一个信息被零宽字符隐藏的字符串时,如何读取隐藏的信息。比如下面的字符串:Oneskilladay就是一个每天更新的栏目,希望每天能在几分钟内提升你。人眼可以正确阅读,但是如果我们把它粘贴到Jupyter中,你会发现零宽字符的痕迹,如下图所示:在上一篇文章中,我们提到我们可以使用零宽字符8204代替1、8205而不是0,所以现在我们只需要使用字符串的.replace()方法将其反向替换即可,如下图所示:我们有了这些二进制数之后,就可以将它们转换成十进制数了首先,然后将其转换成汉字,如下图所示:现在,我们要将这个过程自动化。实现一段代码,依次遍历字符串中的每一个字符,如果找到一个连续由8204和8205组成的字符串,就保存,直到遇到一个共同的字符。得到每一个由零宽字符组成的字符串后,以字符串的形式替换成二进制数,然后用int函数转成十进制数,再用chr函数转成普通字符。这个逻辑的代码实现如下图所示:sentence='一???????????????日???????????????一????????????????技???????????????是???????????????一???????????????个????????????????每???????????????天???????????????更???????????????新????????????????的???????????????栏???????????????目???????????????,????????????????希???????????????望???????????????做???????????????到????????????????在???????????????每???????????????天???????????????几???????????????minute??????????????zhong?????????????'char_1=chr(8204)char_0=chr(8205)hide_word_start=Falsehide_word=''hide_word_list=[]forcharinsentence:ifcharnotin[char_1,char_0]:ifnothide_word_start:continueelse:hide_word_list.append(hide_word)hide_word=''hide_word_start=Falseelse:hide_word+=charifnothide_word_start:hide_word_start=Truecode_book={}forwordinhide_word_list:ifwordincode_book:continueword_in_1_0=word.replace(chr(8204),'1').replace(chr(8205),'0')real_word=chr(int(word_in_1_0,2))code_book[word]=real_wordforhide_word,real_wordincode_book.items():sentence=sentence.replace(hide_word,real_word)print(sentence)运行效果如下图所示:关注下方二维码。转载本文请联系Code公众号。
