如何将非 nbsp 重新定义为 nbsp

How do I redefine a non-nbsp to be a nbsp

据我所知只有两个不间断 spaces:U+a0(不间断 space)和 U+202f(窄不间断 space).但是,还有其他 space 在使用,每个都有自己的用法。对于千位分隔符,Unicode Standard 5.0 推荐使用 U+2009 (thin space),它——‘[u]nlike U+2002 to U+2008, its width may get adjusted in typesetting’——因此是正确的space 使用,使其与文本中的任何理由相匹配。 (除了用作千位分隔符之外,它可能还有其他用途,但我们正在研究排版,这属于设计 SO。)

此 space 的问题在于它被定义为分隔符 space,并且您不希望在数字中间有分词符。有没有办法重新定义一个特定的角色来改变它的行为方式,即 .number { } class?据我所知,伪元素不能执行此任务,伪选择器也不能。有办法实现吗?

截至目前,我能想到的唯一解决方法是每次需要 space 时使用 <span class="thinsp" />,然后根据需要定义 class。示例:

HTML:

<p>
  The Earth orbits the sun some 149
  <span class="thinsp" />597<span class="thinsp" />
  870 kilometres away from the sun. Given the speed of light, which is 299
  <span class="thinsp" />792<span class="thinsp" />
  458 metres per second, … … …
</p>

CSS:

.thinsp {
   whitespace: nowrap
}
.thinsp::after {
   content: "09";
}

但是,如果您有很多数字想要排版好,那么这会产生绝对可怕的结果 HTML有没有办法重新定义 U+2009 的本质使其不在行尾换行?

无法像 HTML/CSS 那样覆盖特定字符的换行行为。我可以为您的问题想出三种可能的解决方案:

  1. 将整个数字包裹在元素中,并禁止使用 white-space: nowrap 换行,就像@CBroe 在评论中建议的那样。例如:<span class="number">1 234</span>
  2. 使用 Unicode 中的任何不间断空格,即 U+00A0 NO-BREAK SPACE、U+2007 FIGURE SPACE 或 U+202F NARROW NO-BREAK SPACE. U+00A0 和 U+202F 在双向文本算法中已经被视为数字分隔符,因此它们似乎是最佳选择。
  3. 使用 THIN SPACE 后接 U+2060 WORD JOINER 作为千位分隔符。 WORD JOINER 是一个不可见的零宽度字符,除了防止在其位置处换行外没有任何语义。