零宽度字符问题

前言

事情是这样子的, 我写的一个知乎优化器脚本的用户黑名单过滤出现异常, 最近知乎的网页改版了不少, 以为是html元素名称发生变化导致没有获取到用户名, debugger一下发现用户名准确获取到了, 但是诡异的是用于存储黑名单的数组Array.includes居然返回的结果是false, 这么简单的一步居然出现异常....

问题

字符

发现字符串在Ctrl+F, 诡异事件出现了, 明明显示有两个"邓德全说书", 但是只显示一个.....
用trim()函数处理一下还是一样...

notepad++

把字符又粘贴到notepad++上, 还是一样, notepad++上并没有显示出任何异常(难道眼花了, 这是不同的字...)

小红点

只能逐个检查字符, 当代码粘贴到console上, 问题出来了, 在vscode, notepad++上没显示的字符在edge浏览器的console控制台上显示出来了

一个奇怪的小红点出现在字符串之后.....

    const a = "邓德全说书​".trim();
    const b = "邓德全说书";
    console.log(a.length);
    for (const e of a) {
        console.log(e.charCodeAt(0));
    }
    for (const e of b) {
        console.log(e.charCodeAt(0));
    }
37011
24503
20840
35828
20070
8203
----
37011
24503
20840
35828
20070

这个奇怪的字符终于发现了, unicode, 8203

zero width

Zero-Width Space, 零宽度空格

zero-width

简而言之, 零宽度字符是一种特殊的不可见的字符

用途和常见类型

usage

处理方法

const clear_zero_width = (text) =>
        text.trim().replace(/[\u200B-\u200D\uFEFF]/g, "");

正则可以非常处理这个问题

总结

问题虽小, 但是一开始处理起来还是比较麻烦的, 根本看不到问题何在

其他

zhihu_optimizer 已趋于完善...一个强大的GM脚本 for 知乎

search