你是否曾经有许多话想对那个她说,却因为没有勇气而迟迟没有说出口,从而错过了一个又一个她
那么何不把你想说的话转换为隐藏字符发给她,这样在你错过下一个她的时候你就可以安慰自己 -- 不是我没说,只是她没发现

前言

一如既往,我在翻大佬的仓库,看有没有说明好玩的时候,发现了使用零宽字符增加隐形水印的一个项目(这个项目很老了)。

原理

零宽字符

以下内容来自知乎与维基百科。

零宽空格(zero-width space, ZWSP)是一种不可打印的Unicode字符,用于可能需要换行处。

HTML页面中,零宽空格可以替代<wbr>。但是在一些网页浏览器(例如 Internet Explorer的版本 6 或以下)不支持零宽空格的功能。

Unicode中,该字符为 U+200B 零宽空格 ,HTML:&#8203;TeX\hskip0pt;在LaTeX中是\hspace{0pt};在groff\:

在 HTML 里的实现类似于软连字符。

这里有三种零宽字符 -- 零宽空格、零宽连字、零宽不连字,在浏览器中对应的转义字符对应如下

零宽空格    --- &#8203;
零宽不连字  --- &#8204;
零宽连字    --- &#8205;

摩斯电码

国际摩尔斯电码可以使用二叉树来记忆,图中每一分叉的左支为点(·),右支为划(-),直到到达所需要表示的字符为止。

二叉树摩斯电码

字符代码字符代码字符代码字符代码
A·- B-···C-·-· D-··
E·F··-·G--·H····
I·· J·--- K-·-L ·-··
M--NO--- P·--·
Q--·-R·-·S··· T-
U··- V···- W·-- X-··-
Y -·--Z--··
字符代码字符代码字符代码字符代码
1.---- 2..---3...-- 4....-
5.....6-....7--...8---..
9 ----.0 -----

摩斯电码与零宽字符转换

使用/作为分隔符将morse这个单词转换为摩斯电码就是

morse  ->   --/---/.-./.../.

现在我们再将/替换为零宽空格-替换问零宽连字.替换为零宽不连字

/   -->    &#8203;
.   -->    &#8204;
-   -->    &#8205;

那么就能将morse这个单词转换为如下零宽字符

&#8205;&#8205;&#8203;&#8205;&#8205;&#8205;&#8203;&#8204;&#8205;&#8204;&#8203;&#8204;&#8204;&#8204;&#8203;&#8204;

将这段零宽字符粘贴进一个HTML文件当中

<p>前</p>
<div>&#8205;&#8205;&#8203;&#8205;&#8205;&#8205;&#8203;&#8204;&#8205;&#8204;&#8203;&#8204;&#8204;&#8204;&#8203;&#8204;</div>
<p>后</p>

在浏览器中打开这个HTML文件,你只能看到 "前后" 两个字

实现

到这了原理可见一般。那怎么用代码去帮我们去完成加密与解密的工作呢?好在前人已经踩坑了。具体可以看一下知乎的这位大佬。
https://zhuanlan.zhihu.com/p/75992161
由于国内屏蔽了github静态托管域名,本人将原版直接改成静态文件以便在国内访问。https://anyfan.gitee.io/morse-encrypt/

使用

  1. pc版QQ不支持零宽字符,会显示空格,但手机版不会
  2. 中文转码长度大约是相同长度英文字符的6倍
  3. 零宽字符虽然看不见但是,但也是一个个字符,所以删除含有零宽字符的文本时,删到零宽字符时会删不动要把零宽字符全部删完才能接着往下删

明明什么都对她说了,但她却一辈子也发现不了。。。简直‌‍‍‌‍​‌‌‍​‍‍‍‌‌​‍‌‌​‍‍‍‌‌​‌‌‌‌‌​‌‍‍‌‍​‌‌‍​‍‍‌‌‌​‌​‌‍​‍‍‌‌‌​‌‍‍‌‍​‌‌‍​‍‌‌‌‌​‌‌‌‌‌​‌​‍‍‍‍‍​‌‍‍‌‍​‌‌‍​‍‌‌‌‌​‌‌‌‌‌​‌‌‌‌‍​‍‌‍‌​‌‍‍‌‍​‌‌‍​‌‌‌‌‌​‌‌‌‌‌​‍‍‍‍‌​‍‌‍‌​‌‍‍‌‍​‌‌‍​‍‌‌‌‌​‍‌‌‌​‌‌‍‍‍​‌‌‍‍‍​‌‍‍‌‍​‌‌‍​‌‌‌‌‍​‌‌‍‌​‍‌‌‌‌​‍‍‍‍‍​‌‍‍‌‍​‌‌‍​‍‍‌‌‌​‍‌‌‌‌​‍‍‍‌‌​‌‌‌‌‍浪漫

本篇参考

最后修改:2020 年 12 月 21 日 07 : 58 PM
赏口饭吃,行行好吧,客官!