JavaScript 从字符串中删除零宽度空间(unicode 8203)

Posted

技术标签:

【中文标题】JavaScript 从字符串中删除零宽度空间(unicode 8203)【英文标题】:JavaScript remove ZERO WIDTH SPACE (unicode 8203) from string 【发布时间】:2014-08-04 00:08:12 【问题描述】:

我正在编写一些处理网站内容的 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

这会带来潜在的问题。该字符是不可见的,因此该行本身没有意义。我可以用 cmets 解决这个问题。但是,如果代码被重复使用,并且文件是使用非 Unicode 编码保存的,(或者当它部署到 SharePoint 时,不能保证它不会弄乱编码),它将停止工作。有没有办法使用 unicode 表示法而不是字符本身来编写它?

[我对这个角色的漫谈]

如果您还没有遇到过这个角色(而且您可能还没有遇到过,因为肉眼看不到它,除非它破坏了您的代码并且您在尝试定位错误时发现了它)它是一个真正的- 会导致某些类型的模式匹配出现故障的孔。我已经为你把野兽关在笼子里了:

[​]

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

【问题讨论】:

【参考方案1】:

unicode转义中的数字应该是十六进制的,8203的十六进制是200B(确实是Unicode zero-width space),所以:

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

Live Example:

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

【讨论】:

谢谢,你是救命稻草!【参考方案2】:

接受的答案不适用于我的情况。

但是这个做到了:

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

【讨论】:

这里也一样!知道为什么吗?尝试了大量的正则表达式解决方案无济于事,而你的工作:)

以上是关于JavaScript 从字符串中删除零宽度空间(unicode 8203)的主要内容,如果未能解决你的问题,请参考以下文章

删除文档中的 U+200B 零宽度空格字符(Typora显示红点)

删除文档中的 U+200B 零宽度空格字符(Typora显示红点)

u200b(零宽度空间)字符在我的 JS 代码中。哪儿来的呢?

在 C# 字符串中摆脱零宽度空间的最简单方法

从Javascript中的数字中删除前导零[重复]

默认情况下如何显示隐藏字符(零宽度空格,即&#8203)