顯隱術(shù):如何閱讀由零寬字符寫(xiě)的信息?
今天,我們來(lái)說(shuō)說(shuō),拿到一段通過(guò)零寬字符隱藏了信息的字符串,我們?cè)趺撮喿x被隱藏的信息。
例如下面這個(gè)字符串:
一日一技是一個(gè)每天更新的欄目,希望做到在每天幾分鐘讓你獲得提高。
人眼能夠正確閱讀,但如果我們把它粘貼到 Jupyter里面,大家就能發(fā)現(xiàn)零寬字符的蹤跡,如下圖所示:
在上一篇文章中,我們提到可以使用零寬字符8204代替1,8205代替0,那么,現(xiàn)在我們只需要使用字符串的.replace()方法,就能反向替換回來(lái),如下圖所示:
有了這些二進(jìn)制數(shù)以后,我們就能把他們先轉(zhuǎn)成十進(jìn)制數(shù),然后再轉(zhuǎn)成漢字,如下圖所示:
現(xiàn)在,我們想把這個(gè)過(guò)程自動(dòng)化。實(shí)現(xiàn)一段代碼,依次遍歷字符串中的每一個(gè)字符,發(fā)現(xiàn)連續(xù)由8204和8205構(gòu)成的字符串,就把它存起來(lái),直到遇到一個(gè)普通字符。拿到每一串由零寬字符構(gòu)成的字符串以后,把它們分別先替換成字符串形式的二進(jìn)制數(shù),然后使用int函數(shù)轉(zhuǎn)成十進(jìn)制數(shù),再使用chr函數(shù)轉(zhuǎn)成普通的字符。
這個(gè)邏輯的代碼實(shí)現(xiàn)如下圖所示:
- sentence = ' 一日一技是一個(gè)每天更新的欄目,希望做到在每天幾分鐘讓你獲得提高。'
- char_1 = chr(8204)
- char_0 = chr(8205)
- hide_word_start = False
- hide_word = ''
- hide_word_list = []
- for char in sentence:
- if char not in [char_1, char_0]:
- if not hide_word_start:
- continue
- else:
- hide_word_list.append(hide_word)
- hide_word = ''
- hide_word_start = False
- else:
- hide_word += char
- if not hide_word_start:
- hide_word_start = True
- code_book = {}
- for word in hide_word_list:
- if word in code_book:
- continue
- word_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_word
- for hide_word, real_word in code_book.items():
- sentence = sentence.replace(hide_word, real_word)
- print(sentence)
運(yùn)行效果如下圖所示:
本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。