你是否曾经有许多话想对那个她说,却因为没有勇气而迟迟没有说出口,从而错过了一个又一个她
那么何不把你想说的话转换为隐藏字符发给她,这样在你错过下一个她的时候你就可以安慰自己 -- 不是我没说,只是她没发现
前言
一如既往,我在翻大佬的仓库,看有没有说明好玩的时候,发现了使用零宽字符增加隐形水印的一个项目(这个项目很老了)。
原理
零宽字符
以下内容来自知乎与维基百科。
零宽空格(zero-width space, ZWSP)是一种不可打印的Unicode
字符,用于可能需要换行处。
在HTML
页面中,零宽空格可以替代<wbr>
。但是在一些网页浏览器(例如 Internet Explorer的版本 6 或以下)不支持零宽空格的功能。
在Unicode
中,该字符为 U+200B 零宽空格 ,HTML:​
在TeX
是\hskip0pt
;在LaTeX
中是\hspace{0pt}
;在groff
是\:
。
在 HTML 里的实现类似于软连字符。
这里有三种零宽字符 -- 零宽空格、零宽连字、零宽不连字,在浏览器中对应的转义字符对应如下
零宽空格 --- ​
零宽不连字 --- ‌
零宽连字 --- ‍
摩斯电码
国际摩尔斯电码可以使用二叉树来记忆,图中每一分叉的左支为点(·
),右支为划(-
),直到到达所需要表示的字符为止。
字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 |
---|---|---|---|---|---|---|---|
A | ·- | B | -··· | C | -·-· | D | -·· |
E | · | F | ··-· | G | --· | H | ···· |
I | ·· | J | ·--- | K | -·- | L | ·-·· |
M | -- | N | -· | O | --- | P | ·--· |
Q | --·- | R | ·-· | S | ··· | T | - |
U | ··- | V | ···- | W | ·-- | X | -··- |
Y | -·-- | Z | --·· |
字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 |
---|---|---|---|---|---|---|---|
1 | .---- | 2 | ..--- | 3 | ...-- | 4 | ....- |
5 | ..... | 6 | -.... | 7 | --... | 8 | ---.. |
9 | ----. | 0 | ----- |
摩斯电码与零宽字符转换
使用/
作为分隔符将morse
这个单词转换为摩斯电码就是
morse -> --/---/.-./.../.
现在我们再将/
替换为零宽空格
;-
替换问零宽连字
;.
替换为零宽不连字
/ --> ​
. --> ‌
- --> ‍
那么就能将morse
这个单词转换为如下零宽字符
‍‍​‍‍‍​‌‍‌​‌‌‌​‌
将这段零宽字符粘贴进一个HTML
文件当中
<p>前</p>
<div>‍‍​‍‍‍​‌‍‌​‌‌‌​‌</div>
<p>后</p>
在浏览器中打开这个HTML
文件,你只能看到 "前后"
两个字
实现
到这了原理可见一般。那怎么用代码去帮我们去完成加密与解密的工作呢?好在前人已经踩坑了。具体可以看一下知乎的这位大佬。
https://zhuanlan.zhihu.com/p/75992161
由于国内屏蔽了github静态托管域名,本人将原版直接改成静态文件以便在国内访问。https://anyfan.gitee.io/morse-encrypt/
使用
- pc版QQ不支持零宽字符,会显示空格,但手机版不会
- 中文转码长度大约是相同长度英文字符的6倍
- 零宽字符虽然看不见但是,但也是一个个字符,所以删除含有零宽字符的文本时,删到零宽字符时会删不动要把零宽字符全部删完才能接着往下删
结
明明什么都对她说了,但她却一辈子也发现不了。。。简直浪漫
本篇参考
4 条评论
想想你的文章写的特别好https://www.ea55.com/
不错不错,我喜欢看 https://www.237fa.com/
看的我热血沸腾啊
博主真是太厉害了!!!