JavaScript从字符串中删除ZERO WIDTH SPACE (unicode 8203)

JavaScript remove ZERO WIDTH SPACE (unicode 8203) from string

本文关键字:SPACE unicode 8203 WIDTH ZERO 字符串 删除 JavaScript      更新时间:2023-09-26

我正在写一些处理网站内容的javascript。当用户按退格键时,SharePoint文本编辑器倾向于在文本中放置"零宽度空格"字符,这使我的努力受挫。该字符的unicode值为8203,或十六进制的B200。我已经尝试使用默认的"替换"函数来摆脱它。我试了很多变体,但都没有效果:

var a = "o​m"; //the invisible character is between o and m
var b = a.replace(/'u8203/g,'');
= a.replace(/'uB200/g,'');
= a.replace("''uB200",'');

等等。关于这个主题,我已经尝试了相当多的变体。这些表达式都不起作用(在Chrome和Firefox中测试),唯一有效的是在表达式中键入实际的字符:

var b = a.replace("​",''); //it's there, believe me

这会带来潜在的问题。这个角色是隐形的,所以这句台词本身没有意义。我可以通过评论来解决这个问题。但是,如果代码被重用,并且文件使用非unicode编码保存(或者当它部署到SharePoint时,不能保证它不会弄乱编码),它将停止工作。是否有一种方法来写这个使用unicode符号,而不是字符本身?

[我对角色的漫谈]

如果你没见过这个字符,(你可能没有见过,因为它是肉眼看不见的,除非它破坏了你的代码,而你在试图定位bug时发现了它)它是一个真正的a-hole,会导致某些类型的模式匹配故障。我已经为你把野兽关进了笼子:

[] <-小心,别让它跑了。

如果您想看到它,将这些括号复制到文本编辑器中,然后将光标遍历它们。您会注意到您需要三步来传递看起来像2个字符的内容,并且您的光标将跳过中间的一步。

unicode转义中的数字应该是十六进制,而8203的十六进制是200B(这确实是unicode零宽度空间),所以:

var b = a.replace(/'u200B/g,'');

生活的例子:

var a = "o​m"; //the invisible character is between o and m
var b = a.replace(/'u200B/g,'');
console.log("a.length = " + a.length);      // 3
console.log("a === 'om'? " + (a === 'om')); // false
console.log("b.length = " + b.length);      // 2
console.log("b === 'om'? " + (b === 'om')); // true

接受的答案对我的情况不起作用。

text.replace(/(^['s'u200b]*|['s'u200b]*$)/g, '')