如何让头发space又细space不断?

How to make a hair space and thin space non-breaking?

我们的项目中有辅助函数,用于将值格式化为人类可读且美观的字符串。

由于设计要求,函数 return 文本包含 各种 白色space 字符(例如 U+2009 «thin space» 或U+200A «头发 space»).

但同样的设计要求要求格式化的文本不间断

我们到了。

我们可以 return 来自这些助手 HTML,而不是纯字符串(然后将 white-space: nowrap CSS 应用于 HTML)。但这需要重构所有使用助手的代码,并使组件中使用格式化值变得复杂(我们使用 React)。

所以这就是问题:如何使任何 Unicode 白色space 字符不间断 没有 HTML/CSS?

Unicode 中有很多功能可以将字符组合成簇并控制文本的视觉属性:组合字符和标记、连接符、选择器、修饰符等。也许至少其中一种可以使任何白色 space 字符不间断? :)

谢谢。

U+2060 WORD JOINER 是一个不可见的 zero-width 字符,其唯一作用是防止在其位置换行。因此,将 WORD JOINER 放在任何空白字符之后将使它成为 non-breaking。 (在空格 之前放置一个 WJ 是没有必要的,因为 Unicode 中的所有空格都会自动禁止 line-breaking 在它们之前。)

UPD1 来自以下评论:

Unicode 标准绝对要求 WJ 保留其 break-blocking 属性。但是,在 Firefox 中有一个 7-years-old bug 实现了 Unicode line-breaking 算法,所以在 Firefox 中,空格+WJ 的组合可以正常工作就像没有WJ的空白

在 Chrome 和 Safari WJ 中按照标准工作。

UPD2 来自 discussion in Twitter (credit to CharlotteBuff and FakeUnicode):

  • 可以使用 U+034F COMBINING GRAPHEME JOINER 代替 U+2060 WORD JOINER 作为 Firefox 的解决方法。它在 Firefox 中阻止 line-breaking,在 Chrome 和 Safari 中阻止 但不阻止 。 U+034F CGJ 的这种使用在语义上也是可疑的,因为 CGJ 有不同的预期目的。尽管如此,U+034F CGJ 极不可能导致任何类型的可访问性问题(使用屏幕阅读器和类似的东西)。

  • 也可以使用U+200D ZERO WIDTH JOINER来防止line-breaking。 ZWJ 在“三巨头”(Chrome、Safari、Firefox)中运行良好。但是,ZWJ 会对周围文本的外观产生不良影响,因为它的目的是在不会自动发生的地方诱导草书连接(例如阿拉伯语:م + ث + ل = مثل)。如果带有 ZWJ 的文本字体中有花哨的连字,ZWJ 可以(并且可能会)触发它们并改变附近符号的形状。

: Wiki denotes ZWJ as «May break: Yes», but it is mistaken.

因此,以下是您可以在浏览器中查看和检查的所有选项:

div {
  outline: 1px solid red;
  width: 20px;
  margin: 10px;
}
<!-- U+00A0 NO-BREAK SPACE -->
<!-- just for example -->
<div>hello&#x00A0;world1</div>


<!-- U+200A HAIR SPACE + U+2060 WORD JOINER -->
<!-- works fine, but does not work in FF -->
<div>hello&#x200A;&#x2060;world2</div>

<!-- U+200A HAIR SPACE + U+034F COMBINING GRAPHEME JOINER -->
<!-- works, but 1) semantically incorrect and 2) does not work in Chrome and Safari-->
<div>hello&#x200A;&#x034F;world3</div>


<!-- U+200D ZERO WIDTH JOINER + U+200A HAIR SPACE + U+200D ZERO WIDTH JOINER -->
<!-- works, even in FF! -->
<div>hello&#x200D;&#x200A;&#x200D;world4</div>

<!-- U+200A HAIR SPACE + U+200D ZERO WIDTH JOINER -->
<!-- works, even in FF! -->
<div>hello&#x200A;&#x200D;world5</div>

您也可以使用 U+202F 窄 no-break space.