Irs*_*P I 8 javascript string ascii non-breaking-characters
我试图调试在字符串内搜索的问题,它归结为以下有趣的代码片段。
\n\n两者"item "和"item "看起来相等,但事实并非如此!
var result = ("item\xc2\xa0" === "item ");\r\n\r\ndocument.write(result);\r\nconsole.log(result);Run Code Online (Sandbox Code Playgroud)\r\n通过将其粘贴到 Python 解释器上进一步研究后,我发现第一个"item "有不同类型的空格,如"item\\xc2\\xa0". 我认为这是一个不间断的空间。
现在,匹配这些字符串的一个可能的解决方案是用\\xc2\\xa0空格替换,但是是否有更好的方法将所有特殊空格字符转换为普通空格?
在 ES2015/ES6 中,您可以使用String.Prototype.normalize()方法将两个字符分解为相同的简单空格字符:
const normalize = str => str.normalize('NFKD');
console.log(normalize("item\u0020") === normalize("item\u00a0"));Run Code Online (Sandbox Code Playgroud)
第一个字符串中的空格是字符代码 160(不间断空格),第二个字符串中的空格是字符代码 32(普通空格),因此两个字符串彼此不相等。
\n\nconsole.log("item\xc2\xa0".charCodeAt(4), "item ".charCodeAt(4));Run Code Online (Sandbox Code Playgroud)\r\n\n\n\n有没有更好的方法将所有特殊空格字符转换为普通空格?
\n
您可以匹配不是制表符或换行符的空格字符并替换为普通空格:
\n\nconst makeSpacesNormal = str => str.replace(/(?=\\s)[^\\r\\n\\t]/g, \' \');\r\nconsole.log(makeSpacesNormal("item\xc2\xa0") === makeSpacesNormal("item "));Run Code Online (Sandbox Code Playgroud)\r\n具体来说,\\s将匹配一大堆类似空格的字符:
[\\t\\n\\v\\f\\r \\u00a0\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u200b\\u2028\\u2029\\u3000]\nRun Code Online (Sandbox Code Playgroud)\n\n通过匹配和替换它们(如果需要,换行符和制表符除外),您将留下普通空格。
\n