前言
事情是这样子的, 我写的一个知乎优化器脚本的用户黑名单过滤出现异常, 最近知乎的网页改版了不少, 以为是html元素名称发生变化导致没有获取到用户名, debugger一下发现用户名准确获取到了, 但是诡异的是用于存储黑名单的数组Array.includes居然返回的结果是false, 这么简单的一步居然出现异常....
问题
发现字符串在Ctrl+F, 诡异事件出现了, 明明显示有两个"邓德全说书", 但是只显示一个.....
用trim()函数处理一下还是一样...
把字符又粘贴到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 Space, 零宽度空格
简而言之, 零宽度字符是一种特殊的不可见的字符
用途和常见类型
处理方法
const clear_zero_width = (text) =>
text.trim().replace(/[\u200B-\u200D\uFEFF]/g, "");
正则可以非常处理这个问题
总结
问题虽小, 但是一开始处理起来还是比较麻烦的, 根本看不到问题何在
其他
zhihu_optimizer 已趋于完善...一个强大的GM脚本 for 知乎