在你的文字上添加水印~
简介~
这个是一个很简单的技术,感兴趣的话这边可以可以看看原文~
Be careful what you copy: Invisibly inserting usernames into text with Zero-Width Characters
My golang demo : Text-WaterMark
在各种图片,pdf里面插入水印算是一种属于保护手段,可以防止某些东西被直接copy走,特别是某一些不讲武德之人,很讨厌的。 不过呢,咱最近看到一些文章,说明了可以使用等宽字符来从某种意义上为文字添加水印,可以用作于某些不错的地方(
这是一串示例,里面添加了水印部分
> I can eat glass and don't hurt body
看起来貌似没什么变化,不过你可以在这边查看~
With watermark
这个水印,这个就是等宽字体的实现了~
How it works?
第一步,将我们需要的水印转换为二进制,这边的代码如下
// textToBinary just type your name,as the watermark.
func textToBinary(username string) string {
binaryStrings := make([]string, len(username))
for i, char := range username {
binaryStrings[i] = fmt.Sprintf("%08s", strconv.FormatInt(int64(int(char)), 2))
}
return strings.Join(binaryStrings, " ")
}
第二步,我们就需要利用这些水印,利用等宽字符
我们可以将二进制中的 1 设置为 零宽度空格,其中的 0 设置为 零宽度非连接字符 类似于提供一种字母表,将字符转换成需要的,因为是二进制缘故,所以理论上各种字符都是支持的。
// binaryToZeroWidth Already Add WaterMark.
func binaryToZeroWidth(binary string) string {
var zeroWidthBuilder strings.Builder
for _, binaryNum := range binary {
if binaryNum == '1' {
zeroWidthBuilder.WriteRune('\u200B') // zero-width space
} else if binaryNum == '0' {
zeroWidthBuilder.WriteRune('\u200C') // zero-width non-joiner
} else {
zeroWidthBuilder.WriteRune('\u200D') // zero-width joiner
}
}
return zeroWidthBuilder.String()
}
之后呢就这类字符的水印已经有了,这样就可以将水印加入到你需要的位置上面 因为零宽字符是不可见的,所以像是和正常文字一样没有什么太怪的变化。
这样一个简单的零宽字符水印就已经完成了,基本上可以通用在各类网站上作为一个水印使用x
解析
我的建议是使用 正则表达式
\p{C}+
这类可以将零宽用正则匹配出来,得到想要的水印。
原理大概就是如此,如果有需要的话,可以在Github上找到相关项目的Python版本和js版本~