简介~

这个是一个很简单的技术,感兴趣的话这边可以可以看看原文~

Be careful what you copy: Invisibly inserting usernames into text with Zero-Width Characters

在各种图片,pdf里面插入水印算是一种属于保护手段,可以防止某些东西被直接copy走,特别是某一些不讲武德之人,很讨厌的。
不过呢,咱最近看到一些文章,说明了可以使用等宽字符来从某种意义上为文字添加水印,可以用作于某些不错的地方(

这是一串示例,里面添加了水印部分


> I can eat glass and don't hurt body‌​‌​‌​​​‍‌​​‌​‌‌​‍‌​​​‌​‌‌‍‌​​‌​‌‌‌‍‌‌​‌‌‌‌‌‍‌​​​‌​​​‍‌​​‌‌‌‌​‍‌​​​‌​‌‌‍‌​​‌‌​‌​‍‌​​​‌‌​‌‍‌​​‌​​‌​‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌​‌​​

看起来貌似没什么变化,不过你可以在这边查看~

With watermark

这个水印,这个就是等宽字体的实现了~

water

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版本~

Last modification:May 24, 2023
喵?