全称为 Non-breaking Space,表示不在此处换行

当页面变窄之后,文字会在空格处折行,但是插入   的空格则不会折行,继续以一行显示

零宽字符

https://juejin.cn/post/6844904164057677831 (opens in a new tab)

零宽空格(zero-width space, ZWSP)用于可能需要换行处。
    Unicode: U+200B  HTML: ​
零宽不连字 (zero-width non-joiner,ZWNJ)放在电子文本的两个字符之间,抑制本来会发生的连字,而是以这两个字符原本的字形来绘制。
    Unicode: U+200C  HTML: ‌
零宽连字(zero-width joiner,ZWJ)是一个控制字符,放在某些需要复杂排版语言(如阿拉伯语、印地语)的两个字符之间,使得这两个本不会发生连字的字符产生了连字效果。
    Unicode: U+200D  HTML: ‍
左至右符号(Left-to-right mark,LRM)是一种控制字符,用于计算机的双向文稿排版中。
    Unicode: U+200E  HTML: ‎ ‎ 或‎
右至左符号(Right-to-left mark,RLM)是一种控制字符,用于计算机的双向文稿排版中。
    Unicode: U+200F  HTML: ‏ ‏ 或‏
字节顺序标记(byte-order mark,BOM)常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的标记。
    Unicode: U+FEFF

使用场景:

  • 可以用来计算一行文字初始的高度,比较 tricky
  • ...

踩坑

零宽字符 + url

在 js 中零宽字符可以通过 \u200B 字面量生成

如果 url 的开头包含了零宽字符,很难察觉,而且会直接 window.open 的行为

let s = "\u200B"; // s.length => 0
window.open(s + "https://www.baidu.com");

我们看到的 url 是 https://www.baidu.com 因为零宽字符不可见

但 window.open 看到的是 \u200Bhttps://www.baidu.com,不是一个合法的 url,所以会当成是当前域名下的 path 去打开新的窗口,最终打开的是 ${originURL}/%E2%80%8Bhttps://www.baidu.com 直接寄了。