如何在Windows中呈现HTML中的窄非间断空格?

36

在法语中,印刷排版要求在各种地方使用狭窄的不间断空格(U+202F)(“Comme ça !”)。

显然,Windows上的所有浏览器都无法支持它们,并且它们都会显示奇怪的字符。这在大多数Mac OS X和Linux上的浏览器上都可以正常工作。

有人知道如何使Windows浏览器正确呈现它吗?

(我认为这是Windows的错误,而不是浏览器的错误,因为只要不在Windows上,Firefox和Safari都支持它。)

7个回答

76
嗯...不对。如果唯一的问题在于   (U+2009)仍然会断开,我更愿意使用以下代码来解决断行问题:

<span style="white-space:nowrap">&thinsp;</span>

为什么呢?

  • 因为法语的fine实际上使用的是一个几乎固定的宽度,在六分之一至四分之一的cadratin(标准空格为0.5 ca.时,约为 0.166 到 0.25 ca.)。选择宽度取决于给定字体中定义的字形已有的方法。

  • 字体被制作成调整其细小间距(U+2009)的宽度:如果这些字体是由法国印刷家制作的(用于渲染法语),则单词中字母之间的空隙比设计用于英语的字体要窄:这是因为与等效的英语文本(例如印刷版圣经)相比,法语文本通常包含更多字母,为了避免增加印刷页面的数量,在法语字体中的字形略微变窄并且间距减小;为了弥补此缩小,法式的fine被增大。 (经常说U+2009是cadratin的五分之一,即0.2 ca,但这是错误的,因为这个值只是一个合理的中间值,在字体中应根据其设计实际调整)。

  • 在英语和英语印刷术中,字符之间的间隙已足够大,可以证明在大多数double标点符号附近的文本中不需要使用细小空格。但是,如果用英语印刷术(其中字符之间的间距较大)渲染法语,则fine应该更窄,并且应该减小到1/6的cadratin。

  • 因此,是的,U+2009(SGML存储库中的&thinsp;)略微可调节,具体取决于字体。

  • 此外,它可能部分合理化(当使用完全合理化时,其中不仅通常的单词之间的空格宽度增加,而且所有字符之间的间距和普通或“细小”空格之间的所有间隙的宽度也增加(但是其他quad空格不应调整宽度:它们真的是固定的)。

当您呈现已经预先计算页面布局(具有已知字体和精确度量)的文档时,细小空格(U+2009)已经是您想要的内容(因为您不必担心断行问题)。

不幸的是,Unicode“忘记”在换行属性中为这些quad空格U+2000..U+2006(以及细小空格U+2009)分配不断行的特性。

Unicode的纠正方法(仅适用于纯文本文件)是添加另一个字符,即U+202F(NARROW NON-BREAKING SPACE),在Unicode 5.1中加入该字符,后来为该字符引用命名为SGML符号名称“nnbsp”(但将此命名字符实体映射到U+202F并非任何HTML或XML标准的一部分,因此除非您的文档在其嵌入式DTD中明确定义了它,否则也不应使用此命名实体!)
但不幸的是,大多数浏览器忘记了增加这个字符以及为什么需要它:它们认为该字符应该在字体中,但很显然并非如此。
所有浏览器都应该将U+202F视为不间断的(即使它们在UCD的内部副本中不知道该字符,这已经是事实)。
但是,浏览器不应该依赖于U+202F在字体中的定义,而应该在每次未在当前字体中映射U+202F时提供对U+2009(THIN SPACE)的回退,但是在同一字体中映射U+2009(通常使用许多字体)(这种情况通常会发生)。
因此,这是HTML渲染器(即浏览器)的问题;我认为这不仅仅是字体的问题,而实际上是浏览器的错误(而不是字体的错误或限制),如果它们不为空格提供这样的回退。当然,所有新字体都应该将U+202F映射到与U+2009相同的字形。
考虑到许多字体都非常支持狭窄间隔(U+2009或&thinsp;),并且具有使用法国排版度量制作的法语文本进行呈现时的正确宽度,或者用于呈现使用英语排版度量制作的英语文本,此应该是在狭窄不间断空格不可用时使用的正确回退!
您可以通过只使用U+2009并使用CSS的“white-space:nowrap”使其不间断来完全模拟U+202F在HTML中的所需行为。这总比更改字体大小以显示伪半空格要好(因为对于许多字体而言,这仍然太大,并且还因为在具有彩色背景的文本范围中不按预期工作:更改字体大小会修改行高)。
因此,请在您的HTML或SVG文档中使用以下代码(仅在纯文本文档中保留U+202F):
<span style="white-space:nowrap">&thinsp;</span>
例如,您可以将此序列保存在可重用的模板中,例如在MediaWiki中将其命名为Template:nnbsp,以在您的页面中作为{{nnbsp}}进行转录。请注意,最好仍然将细间隔符号符号化地引用为&thinsp;,而不是强制使用像&#x2009;这样的精确Unicode代码点:命名实体可以由渲染器重新映射,或根据用户偏好映射到另一个工作空格。
请注意,MS-Word实际上使用U+2009而不是U+202F来表示其自己的fine。这是正确的,因为Word文档具有预计算的布局,并且因为MS-Word在计算页面布局时强制执行本地的不间断行为。 Word文档不是纯文本文档。
呈现示例(使用背景颜色展示行高未被修改,但不幸的是该网站除了在<code>部分中允许设置背景颜色外,其他地方不允许设置,如此处使用等宽字体): Exemple de « fine » insécable française correctement codée ! 没有<code>容器的相同内容不会显示背景颜色,但它确实使用常规比例字体,以便细间隔符号实际上被呈现为细间隔: Exemple de « fine » insécable française ; correctement codée ! 使用&#x202F;(通常在大多数字体中不受支持的NNBSP,但这可能最终适用于您当前的浏览器和系统上安装的字体,例如DejaVu Sans)的示例: Exemple de « fine » insécable française ; correctement codée ! 使用&#x2006;(CADRATIN的六分之一,可能有效,但对于您的字体来说可能太窄,并且可能不显示不间断行属性)的示例: Exemple de « fine » insécable française ; correctement codée ! (嗯...不太行)
使用&nbsp;(几乎总是太大)的示例: Exemple de « fine » insécable française ; correctement codée ! (呃...不太行)

2
你的回答不仅有帮助(虽然有点长),而且似乎相当有见识和合理。感谢你的帮助。这确实让我们在本地化网站的业务中感到痛苦,因为以前是纯文本的消息现在可能会变成标记,因此需要跳过转义部分。那么,您是否知道为什么FireFox和Safari浏览器在Linux和Max OS X上都支持 ,但在Windows上却不支持呢?这只是因为Linux和Max OS X字体具有该符号,而Windows字体没有吗?如果浏览器实现了回退,这将不是问题。 - FroMage
2
Linux和Mac OSX版本可能使用文本渲染库(或操作系统服务)来实现当字体没有字符时的回退。然后浏览器只是使用这些API或库。 鉴于Windows在其文本渲染API(GDI,GDI + ...)中没有实现此字体回退,使用它的浏览器无法显示该字符。 我知道Firefox对某些字符使用自己的内部回退,但其中许多都相当差。但我看不出为什么浏览器不会为空格自己实现回退。 - Verdy_p
2
请注意,Safari 在Windows上无法显示U+202F,但Google Chrome可以显示(即使两个浏览器都使用应该使用相同文本呈现库的WebKit):Chrome然后在WebKit之外实施回退,或者它使用了一个修补过的WebKit版本。 - Verdy_p
1
请注意,法语在呈现数字时使用不间断空格:正常的<i>细体</i>用作数字组的分隔符。但是,在英语中,为了使表格中的数字对齐,<i>数字间距</i>用于替换缺失的数字,<i>标点间距</i>用于替换小数分隔符(英语中为点号,但法语中为逗号,可能会稍微大一些,很可能像一个<i>细体</i>)。这两个空格也是不间断的,但在完全对齐(字符间隙)的情况下仍可能扩大,例如数字和点。 - Verdy_p
1
图形空格和点空格在HTML中没有用处,使用CSS的"display:hidden"或"color:transparent"将它们正确地设置为零数字或点/逗号标点符号的宽度,并对表格进行正常对齐更简单。这两个空格仅用于印刷排版(处理具有预计算页面布局的文档时)。 - Verdy_p
显示剩余3条评论

6
补充 2021 年: 现如今,所有实际的浏览器都可以正常渲染窄间隔不换行空格&#8239;,这些“hack”不再需要了 :-)

这意味着我们可以使用   仅仅是为了让它更明显。 - bugybunny

5
我进行了更深入的调查,似乎是字体问题。FileFormatInfo 对于处理Unicode问题非常有用,其中包括一个页面列出支持这个特定字符的字体。甚至还有一个Flash工具(点击页面上列出支持的字体的蓝色框内 - 由于某种原因我无法制作正确的URL),它列出了所有本地安装的字体,并为每个字体显示此字符。

好的,这肯定有帮助。Flash应用程序显示了许多方块,空或填充的,这意味着我猜测我的字体不支持它。由于这是默认的XP安装,我假设XP默认不支持它。现在尝试下载一些Vista字体... - FroMage
我刚访问了安装了法语区域设置的Vista系统上的Flash页面,似乎唯一支持这个字符(即没有方框显示)且看起来有些“正常”的字体是“Microsoft Sans Serif”。 - Rich

1
为什么不只用 &#x202F;

这正是我正在做的事情,但在Windows上它无法正确渲染。 - FroMage
3
你所使用的字体可能没有这个字符的字形。 - Gumbo
你知道有哪些Windows字体应该包含它吗?快速浏览字符选择器,发现这个字符并不在大多数列表中。 - FroMage

0

最糟糕的黑客攻击:

<span style="margin:-0.08em">&nbsp;</span>

0

你可以这样做,但并不理想。

<span style="font-size:50%;"> </span>

我可以这样做,但我认为一定有办法使Windows正确渲染它...也许是字体问题... - FroMage

0
你可以在像CKEditor这样的所见即所得编辑器中按Ctrl+shift+2,然后进入源HTML视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接