如何移除文本中的Zero width joiner及其他零宽隐形字符?
如何移除零宽连接符(Zero Width Joiner)这类隐形字符?
你遇到的问题确实挺头疼:文本里藏着零宽连接符(‍),在UI界面里完全看不见,但一发短信到iPhone上就变成问号,而且用text.gsub("‍", "")的方法根本删不掉它。
问题出在你匹配的是HTML实体字符串‍,但实际文本里的字符已经是对应的Unicode编码(U+200D)了,所以直接替换实体自然起不到效果。
更新:
补充@matt的答案,Unicode里其实不止零宽连接符,还有几种常见的零宽隐形字符,都可能导致类似的显示问题:
- U+200B 零宽空格(zero width space)
- U+200C 零宽非连接符(zero width non-joiner)
- U+200D 零宽连接符(zero width joiner)
- U+FEFF 零宽不换行空格(zero width no-break space)
想要一次性清理这些隐形字符,用正则表达式是最方便的方案,代码如下:
text = text.gsub(/[\u200B\u200C\u200D\uFEFF]/, '')
(注:原代码里的/[-]/虽然能生效,但里面包含的隐形字符会让正则可读性极差,换成Unicode转义写法更稳妥,也方便后续维护)
内容的提问来源于stack exchange,提问作者Sampat Badhe
相关产品推荐
相关产品推荐

