WishMeLz

生活其实很有趣

零宽非连接符 [ZWNJ] U+200C

今天发现一个问题,12位长度的字符串,length居然有14位
102791017246‌‌

2025-05-15T02:19:51.png

2025-05-15T02:24:31.png

encodeIRL试试看

encodeURI(str)
'102791017246%E2%80%8C%E2%80%8C'
for (let i = 0; i < str.length; i++) {
    console.log(`位置 ${i}: '${str[i]}' - Unicode: ${str.charCodeAt(i)}`);
}

2025-05-15T02:21:21.png

打印看看

function visualizeInvisibleChars(str) {
    return str
        .replace(/\u200C/g, '[ZWNJ]')  // 零宽非连接符
        .replace(/\u200D/g, '[ZWJ]')   // 零宽连接符
        .replace(/\u200B/g, '[ZWSP]')  // 零宽空格
        .replace(/\u00A0/g, '[NBSP]'); // 非断行空格
}
console.log(visualizeInvisibleChars(str));
102791017246[ZWNJ][ZWNJ]

清理方法

移除所有零宽字符
function cleanString(str) {
    return str
        .replace(/[\u200B-\u200D\uFEFF]/g, '') // 移除零宽字符
        .replace(/\s+/g, ' ')                  // 规范化空白字符
        .trim();
}