JavaScript:用普通 space 替换不间断 space 和特殊 space 字符

JavaScript: replace non breaking space and special space characters with ordinary space

我试图调试一个在字符串中搜索的问题,结果归结为以下有趣的代码段。

"item ""item " 看起来是一样的,其实不然!

var result = ("item " === "item ");

document.write(result);
console.log(result);

通过将其粘贴到 Python 解释器进一步调查后,我发现第一个 "item ""item\xc2\xa0" 有不同类型的 space。我认为是 non breaking space.

现在,匹配这些字符串的可能解决方案是将 \xc2\xa0 替换为 space,但是是否有更好的方法将所有特殊 space 字符转换为普通 space?。

第一个字符串中的space是字符代码160(一个不间断的space),第二个字符串中的space是字符代码32(一个普通的space), 因此字符串彼此不相等。

console.log("item ".charCodeAt(4), "item ".charCodeAt(4));

is there a better approach to convert all special space characters with normal space?.

您可以匹配 space 个不是制表符或换行符的字符,并替换为正常的 space:

const makeSpacesNormal = str => str.replace(/(?=\s)[^\r\n\t]/g, ' ');
console.log(makeSpacesNormal("item ") === makeSpacesNormal("item "));

具体来说,\s 将匹配 a whole bunch of space-like characters:

[\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]

并通过匹配和替换它们(换行符和制表符除外,如果需要),您将得到普通的 spaces。

trim 将删除字符串开头和结尾的所有空格。如果您想在忽略前导和尾随空格的情况下比较两个字符串,trim 两个。

"item ".trim() === "item ".trim()

在ES2015/ES6中你可以使用String.Prototype.normalize()方法将两个字符分解为同一个简单的space字符:

const normalize = str => str.normalize('NFKD');
console.log(normalize("item\u0020") === normalize("item\u00a0"));