顯隱術:如何閱讀由零寬字符寫的信息?
今天,我們來說說,拿到一段通過零寬字符隱藏了信息的字符串,我們怎么閱讀被隱藏的信息。
例如下面這個字符串:
一日一技是一個每天更新的欄目,希望做到在每天幾分鐘讓你獲得提高。
人眼能夠正確閱讀,但如果我們把它粘貼到 Jupyter里面,大家就能發現零寬字符的蹤跡,如下圖所示:
在上一篇文章中,我們提到可以使用零寬字符8204代替1,8205代替0,那么,現在我們只需要使用字符串的.replace()方法,就能反向替換回來,如下圖所示:
有了這些二進制數以后,我們就能把他們先轉成十進制數,然后再轉成漢字,如下圖所示:
現在,我們想把這個過程自動化。實現一段代碼,依次遍歷字符串中的每一個字符,發現連續由8204和8205構成的字符串,就把它存起來,直到遇到一個普通字符。拿到每一串由零寬字符構成的字符串以后,把它們分別先替換成字符串形式的二進制數,然后使用int函數轉成十進制數,再使用chr函數轉成普通的字符。
這個邏輯的代碼實現如下圖所示:
- sentence = ' 一日一技是一個每天更新的欄目,希望做到在每天幾分鐘讓你獲得提高。'
- 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)
運行效果如下圖所示:
本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。