最近看到word-wrap源码里面有一个正则,有点迷惑:if (options.cut !== true) {

regexString += '([\\s\u200B]+|$)|[^\\s\u200B]+?([\\s\u200B]+|$)';

}复制代码

零宽空格

如果要搞清楚这句正则是干什么的,就需要了解到零宽空格了。零宽空格(zero-width space, ZWSP)是一种不可打印的Unicode字符,用于可能需要换行处。zh.wikipedia.org/wiki/%E9%9B…

复制这个om,作如下动作:

那这个和加密有什么关系呢?

水印原理

我们不难查到,零宽空格会延伸到零宽连字。

零宽连字和零宽不连字零宽连字(zero-width joiner,ZWJ)是一个控制字符,放在某些需要复杂排版语言(如阿拉伯语、印地语)的两个字符之间,使得这两个本不会发生连字的字符产生了连字效果。零宽连字符的Unicode码位是U+200D (HTML: ‍ ‍)。zh.wikipedia.org/wiki/%E9%9B…

具体例子可以看到wiki上的例子。零宽不连字 (英文:zero-width non-joiner,缩写:ZWNJ)是一个不打印字符,放在电子文本的两个字符之间,抑制本来会发生的连字,而是以这两个字符原本的字形来绘制。Unicode中的零宽不连字字符映射为U+200C zero width non-joiner,HTML字符值引用为: ‌zh.wikipedia.org/wiki/%E9%9B…

文本水印

我们常见的有图片水印,软件水印,视频水印等。那文本上的水印要是什么样子呢?文本中间穿插文案,比如这是一段[xxx.com]示例文案,说明这句话[xxx.com]的出处。

文本中通过某些不可见的字符,来携带水印。用户看不见,但是复制粘贴会携带上。

第一种就不说了,我们来看看第二种。上面说了两种领宽字符,恰好满足了不可见,且会被复制的特点。那要怎么用这两个字符呢?

原理

我们约定如下:ZWJ -> 0

ZWSP -> 1

ZWNJ -> 无

有一段文本:这是一段示例文案,说明这句话的出处,水印为xxx.com。伪代码:let zwj = '‍'let zwsp = '&zwsp;'let zwnj = '‌'let dict = {  0: zwj,  1: zwsp,

}let source = '这是一段示例文案,说明这句话的出处'let logo = 'xxx.com'let watermask = log// 追加`source${watermask}`复制代码

如果这里我们把水印换成1011,我们可以很快的实现:let logo = '1011'let watermask = zwsp + zwj + zwsp + zwsp`source${watermask}` // 这是一段示例文案,说明这句话的出处&zwsp;‍&zwsp;&zwsp;复制代码

如果要换成更丰富的水印字符,我们需要有一个作为无的标识,引入了zwnj如下:let logo = 'ab' // 或者更复杂let watermask = logo.map(char => tsf(char)).join(zwnj)// 每个字符转为二进制码function tsf(char) {let b = char.charCodeAt().toString(2) // a => 1100001

// 转为零宽字符标识return b.map(itm => {  return dict[itm]

})

}复制代码

解密的话,上面逆向即可。

总结

整个流程就是

应用场景博客文章署名

小说网站等

注意

这种加密方式虽然一般情况是无感知的,但**如果在有些编辑器中粘贴,是可以看到零宽字符的。**比如开头的截图,浏览器的控制台是可以看到这个字符的。

android零宽空格,零宽字符文本水印原理相关推荐

  1. android中用点标识路径,Android Bitmap、路径、图片加上文本水印

    前沿 不同的app可能需要加上不同的logo标识这张图片归属问题,比如微博图片可能涉及到原图版权,或者涉及到个人信息认证敏感信息,从安全的角度来说也需要加上特定的文本logo用于标识此图的所属用途. ...

  2. android零宽空格,特殊字符的问题—零宽空格

    一.问题 在使用mpdf生成pdf文件的时候,出现了一个异常,在一个字符串后面,莫名了多了一个乱码符号: 但是在页面上看这个数据,是正常的: 查看其它的同类型数据,都是好的,唯独这个数据有问题. 二. ...

  3. android 自动补全方法,Android零基础入门|自动完成文本框AutoCompleteTextView

    原标题:Android零基础入门|自动完成文本框AutoCompleteTextView 上一期学习的Spinner的使用,掌握的怎么样?本期一起来学习AutoCompleteTextView的使用. ...

  4. 零基础入门NLP - 天池新闻文本分类Task3笔记

    零基础入门NLP - 天池新闻文本分类 以下以Datawhale与天池举办的新闻文本分类这个NLP赛题做的NLP入门Task2笔记 赛题链接:https://tianchi.aliyun.com/co ...

  5. 轻松搞定表白女朋友:Android版APP (零基础也可直接下载软件)

    轻松搞定表白女朋友:Android版软件 (零基础也可直接下载软件) 在我们平时生活当中,经常会看到一些表白女朋友的html网页,但是Android端的表白软件可以说是基本没有,笔者在全网搜了一下,就 ...

  6. Android获取屏幕宽高,状态栏宽高,actionbar宽高,layout宽高,导航栏高度的方法汇总

    看这个博客你可以知道 获取屏幕宽高,状态栏宽高,actionbar宽高,layout宽高,导航栏(虚拟按键栏)高度的方法 目录顺序为 代码测试的机型 状态栏高度 actionbar高度 屏幕高度 导航 ...

  7. android 获取url中的参数,验证邮箱格式,截取字符串中键值对的值,String的字节长度,去空格,替换字符

    String ss="hello"; byte[] buff=ss.getBytes(); int f=buff.length; System.out.println(f); 字节 ...

  8. 数据安全:基于不可见字符的文本水印技术

    一.概述 信息媒体的数字化为信息的存取提供了极大的方便,越来越多的业务现在都是基于网络信息完成的.与此同时,信息的泄露,篡改,盗版等也困扰这很多公司以及个人.那么如何降低这些风险或者说泄露了信息如何溯 ...

  9. android动态添加圆,Android开发中TextView 实现右上角跟随文本动态追加圆形红点

    在一个比较坑的需求里,一段文字右上角需要追加一个圆形红点.最右侧有个金额,红点动态随着文字移动,然后各种摆布局,一下午坑死我了.后来果断放弃.然后就想试试直接自定义view来实现这个需求. 最坑的就是 ...

最新文章

  1. 陈天桥:欣赏360保护隐私 用户安全永远第一
  2. 文末福利|云原生下Java的变化与趋势?程序员为什么不喜欢低代码?答案在这里!...
  3. Qt QDialog将窗体变为顶层窗体(activateWindow(); 和 raise() )
  4. MPLS的几种备份方式——Vecloud
  5. redis StackExchange 主备 实现 demo
  6. JSON基础与数据解析、JSON方法、AJAX初识
  7. oracle静默安装集群,静默安装Oracle数据库10g篇
  8. DIV CSS在不同IE版本和FF以及Chrome中的兼容性差异解决方法(推荐)
  9. MacBook搭建go语言开发环境
  10. NodeJS 正则路由匹配
  11. linux找数组规矩,linux shell 数组建立及使用技巧(示例代码)
  12. java中readline函数_自定义BufferedReader中read和readLine方法
  13. yum更换国内源、yum下载rpm包  源码包安装
  14. 公司内网与外网连通中的一些小问题(达内)
  15. Eclipse的安装
  16. 电容屏和电阻屏的区别
  17. 证明:模n加法满足结合律
  18. ac68无线网卡 linux驱动下载,华硕ac68驱动|华硕USB-AC68无线网卡驱动下载 V2.1.2.1 官方版 - 比克尔下载...
  19. 使用paddlepaddle进行手写数字识别
  20. stc15f2k60s2.h

热门文章

  1. 2.1在 U-Boot 中添加自己的开发板
  2. flash能否制作html游戏,10件Flash可以做而HTML5做不了的事情
  3. windows下使用nvm管理node版本
  4. Node与namespace
  5. 设计模式(二)23种设计模式
  6. 关于手机和固话号码正则表达式
  7. template不支持v-show
  8. 网络安全学习2个月,感觉什么都不会?
  9. 地铁车辆基础制动装置设计
  10. 杂谈:中华英才裁员事件