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

时间:2020-01-09 07:40:41

标签: javascript string ascii non-breaking-characters

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

"item ""item "似乎相等,但事实并非如此!

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

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

在将其粘贴到Python解释器上进行了进一步研究之后,我发现第一个"item ""item\xc2\xa0"的空间类型不同。我认为是non breaking space

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

3 个答案:

答案 0 :(得分:3)

第一个字符串中的空格是字符代码160(不间断空格),而第二个字符串中的空格是字符代码32(普通空格),因此这两个字符串彼此不相等。 / p>

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

是否有更好的方法将所有特殊空格字符转换为普通空格?。

您可以匹配不是制表符或换行符的空格字符,并替换为普通空格:

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]

,然后通过匹配和替换这些内容(如果需要,可使用换行符和制表符除外),将剩下普通的空格。

答案 1 :(得分:3)

在ES2015 / ES6中,您可以使用String.Prototype.normalize()方法将两个字符分解为相同的简单空格字符:

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

答案 2 :(得分:0)

trim将删除字符串开头和结尾的所有空格。如果要在忽略开头和结尾空格的同时比较两个字符串,请对它们进行修剪。

"item ".trim() === "item ".trim()
相关问题