【问题标题】:How to render narrow non-breaking spaces in HTML for Windows?如何在 Windows 的 HTML 中呈现狭窄的不间断空格?
【发布时间】:2010-10-10 08:52:49
【问题描述】:

在法语中,排版要求我们在不同的地方使用 不间断空格(U+202F)(“Comme ça!”)。

显然,Windows 上的每个浏览器都不支持这一点,而是都显示了一个奇怪的字符。这适用于 Mac OS X 和 Linux 上的大多数浏览器。

有谁知道如何让 Windows 浏览器正确呈现它?

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

【问题讨论】:

    标签: html windows internationalization typography


    【解决方案1】:

    嗯……不。如果唯一的问题是  (U+2009) 仍在中断,我会更喜欢使用:

    纠正破坏行为。为什么?

    • 因为法语 fine 有效地使用了六分之一到四分之一之间的固定宽度 cadratin(0.166 到 0.25 ca.,当标准空间是 0.5 ca. ) 宽度的选择取决于给定字体定义的字形中已经存在的方法。

    • 字体用于调整其窄空间的宽度 (U+2009):如果这些字体是由法语版式制作的(用于呈现法语),则 approche(或字中的字母)比为英文设计的字体窄:这是因为法文文本通常包含比同等英文文本(例如印刷版圣经)更多的字母,并且为了避免增加印刷页数,法文字体中的字形是变得更窄,并减少了方法;为了弥补这种减少,增加了法语 fine 的大小。 (常说 U+2009 是五分之一的 cadratin,即 0.2 ca.,但这是错误的,因为这个值只是一个合理的中值,应该根据字体设计有效地调整它)。

    • 在带有英文排版的英文中,字符间的间隙已经足够大,足以证明在大多数 标点符号附近的文本中使用了无细空格这一事实。但是,如果使用使用英文版式(字符间距较大)的字体呈现法语,则 fine 应该更窄并且应该减少到 1/6 cadratin。

    • 是的,U+2009(SGML 存储库中的 )可以根据字体进行微调。

    • 1234563但其他四边形空间的宽度不得调整:它们确实是固定的)。

    当您渲染一个页面布局已经预先计算(使用已知字体和精确度量)的文档时,细空间 (U+2009) 已经是您想要的(因为您不必担心破坏行为。

    不幸的是,Unicode忘记为这些四边形空间 U+2000..U+2006(以及细空间 U+2009)分配换行属性中的不间断行为。

    Unicode 纠正它的唯一方法(仅适用于纯文本文档)是在 Unicode 5.1 中添加另一个字符,即 U+202F(窄非中断空间),后来被赋予 SGML 符号名称“ nnbsp" 用于字符引用(但此命名字符实体到 U+202F 的映射不是任何 HTML 或 XML 标准的一部分,因此不应使用此命名实体,除非您的文档在其嵌入的 DTD 中明确定义它! )

    但不幸的是,大多数浏览器都忘记了应用这个添加以及为什么需要它:他们认为字符应该是字体,但显然不是这样。

    所有浏览器都应该将 U+202F 视为非中断(这已经是这种情况,即使它们不知道其 UCD 内部副本中的字符)。

    但是,浏览器不应该依赖于 U+202F 是在字体中定义的事实,相反,它们应该在渲染时提供对 U+2009 (THIN SPACE) 的回退,每次 U+202F 未映射到当前字体,但 U+2009 映射为同一种字体(很多字体一般都是这种情况)。

    所以这是 HTML 渲染器(即浏览器)中的问题;我还认为这不仅仅是字体的问题,它实际上是浏览器的一个错误(而不是字体的错误或限制),如果它们不为空格提供这样的后备的话。当然,所有新字体都应将 U+202F 映射到与 U+2009 相同的字形。

    鉴于窄空间(U+2009 或  )在许多字体中都得到了很好的支持,并且具有正确的宽度,可以使用使用法语排版指标的字体渲染法语文本,或者渲染使用英文排版指标,这应该是每次狭窄的不间断空间不可用时使用的正确后备!

    您可以在 HTML 中完美地模拟 U+202F 的所需行为,只需使用 U+2009 并使用 CSS 的“white-space:nowrap”使其不中断。它总是比改变字体大小来显示一个伪半空间更好(因为这对于许多仍然太大的字体是不正确的,而且因为这在文本范围内不能按预期工作有彩色背景:更改字体大小会修改行高)。

    所以请在您的 HTML 或 SVG 文档中使用此代码(保留 U+202F 仅用于纯文本文档):

    您可以将此序列保存在可重复使用的模板中,例如,您可以在 MediaWiki 中将其命名为 Template:nnbsp,以便将其嵌入到您的页面中为 {{nnbsp}}

    请注意,仍然最好将细空间符号引用为  ,而不是强制使用像   这样的精确 Unicode 代码点:命名实体可以由渲染器重新映射,或者根据用户偏好重新映射到另一个工作空格。

    请注意,MS-word 确实使用 U+2009 而不是 U+202F 来表示它自己的 fine。这是正确的,因为 Word 文档具有预先计算的布局,并且 MS-Word 在计算页面布局时在本地强制执行非中断行为。 Word 文档不是纯文本文档。

    • 渲染示例(使用背景颜色来展示行高未修改,但不幸的是,该站点不允许设置背景颜色,除非在<code> 部分,如此处使用等宽字体):

    <i>Exemple de « fine » insécable française correctement codée !</i>

    • 同样的没有&lt;code&gt;容器不显示背景颜色,但它确实使用了正常的比例字体,因此细空间被有效地呈现为细:

    « fine »无法形容的法语 的例子;更正代码 !

    • 使用&amp;#x202F; 的示例(大多数字体通常不支持NNBSP,但这最终可能适用于您当前的浏览器和系统上安装的字体,例如DejaVu Sans):

    例子 de «fine» insécable française;更正代码!

    • 使用&amp;#x2006; 的示例(CADRATIN 的六分之一,可能有效,但可能对您的字体来说太窄,并且可能不会表现出不间断的属性):

    « fine »不可分割的法语的例子;更正代码 !(嗯……不是真的)

    • 使用&amp;nbsp; 的示例(几乎总是太大):

    “很好”的法国不可分割的例子;更正代码!(嗯……不是真的)

    【讨论】:

    • 您的回答不仅有帮助(如果有点长的话),而且看起来也很有教育意义并且很有道理。谢谢你的帮助。它确实使我们在本地化网站业务中的生活变得悲惨,因为曾经是纯文本的消息现在可能会变成标记,因此需要跳过转义部分。你知道为什么支持   的 FireFox 和 Safari 浏览器吗?在 Linux 和 Max OS X 上,不在 Windows 上?只是 Linux 和 Max OS X 字体有这个符号,而 Windows 字体没有?如果浏览器实现了回退,哪个不会有问题?
    • Linux 和 Mac OSX 版本可能正在使用文本渲染库(或 OS 服务),当字体没有字符时实现回退。然后浏览器只使用这些 API 或库。鉴于 Windows 未在其文本呈现 API(GDI、GDI+...)中实现此字体回退,使用它的浏览器无法显示该字符。我知道 Firefox 对某些字符使用自己的内部后备,但其中许多非常糟糕。但我认为浏览器没有理由不为空格实现回退。
    • 请注意,Safari 不会在 Windows 上显示 U+202F,但 Google Chrome 会显示它(即使两个浏览器都使用 WebKit,它应该使用相同的文本呈现库):Chrome 正在实现在 Webkit 之外回退,或者它使用 Webkit 的修补版本。
    • 请注意,法语在表示数字时使用不间断空格:普通的 fine 用作数字组的分隔符。但是,同样在英文中,为了对齐表格中的数字,数字空格用于替换缺失的数字,标点空格用于替换小数分隔符(点在英文,但法文的逗号,可能有点大,很可能像 fine。这两个空格也是不间断的,但在完全对齐的情况下仍然可以扩大(intercharacter间隙),如数字和点。
    • 图形空间和点空间在 HTML 中没有用处,通过在 CSS 的 "display:hidden" 或“颜色:透明”,然后正常对齐表格。这两个空格仅用于排版(在处理具有预先计算的页面布局的文档时)
    【解决方案2】:

    我做了更多的挖掘,它看起来确实是一个字体问题。 FileFormatInfo 对于处理一般的 Unicode 问题非常有用,它包括一个 page 列出支持 this particular character 的字体。甚至还有一个 Flash 工具(单击页面上列出支持的字体的蓝色框内以获取它 - 由于某种原因我无法创建正确的 URL),它列出了您本地安装的所有字体并为每个字体显示此字符.

    【讨论】:

    • 好的,这绝对有帮助。 Flash 应用程序显示很多正方形,无论是空的还是满的,这意味着我想我的字体不支持它。由于这是默认的 XP 安装,我假设 XP 默认不支持它。现在正在尝试下载一些 Vista 字体……
    • 我刚刚访问了法语语言环境 Vista 安装上的 Flash 页面,并且唯一看起来模糊“正常”的支持该字符的字体(即没有显示框)是“Microsoft Sans衬线”。
    【解决方案3】:

    为什么不只是&amp;#x202F;

    【讨论】:

    • 这正是我正在做的,但在 Windows 上它不能正确呈现。
    • 您使用的字体可能没有该字符的字形。
    • 你知道任何应该有的 Windows 字体吗?快速浏览角色选择器会发现该角色不在大多数列表中。
    【解决方案4】:

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

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

    【讨论】:

    • 我可以,但我假设必须有一种方法可以让 Windows 正确呈现它……也许是字体问题……
    【解决方案5】:

    您可以在 CKEditor 等所见即所得编辑器中按 Ctrl+shift+2,然后转到源 HTML 视图。

    【讨论】:

      【解决方案6】:

      最糟糕的黑客攻击:

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

      【讨论】:

        【解决方案7】:

        2021 年附录: 如今,所有实际的浏览器都可以渲染(狭窄的不间断空间)。 不再需要这些“黑客”了:-)

        【讨论】:

          猜你喜欢
          • 2014-01-26
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 2014-03-11
          • 2010-09-10
          • 2017-10-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多