如何在具有保留字符宽度的 HTML 中使用等宽字体显示特殊的 unicode 字符

Posted

技术标签:

【中文标题】如何在具有保留字符宽度的 HTML 中使用等宽字体显示特殊的 unicode 字符【英文标题】:How to display special unicode characters using monospace font in HTML with preserved character width 【发布时间】:2012-03-10 05:40:22 【问题描述】:

我正在使用 pre 元素来显示一些文本,包括特殊的 Unicode 字符 (⚡ ⚑ ▶ ◀ ⁋)。 我注意到浏览器渲染这些特殊字符比普通字符更宽,水平占用更多空间。

这很容易在这里看到:https://gist.github.com/968b5c22cce14909cf27 两行都有 20 个字符,但请注意第一行更长(屏幕像素)。

有没有办法(CSS)强制前置元素(或其他应用等宽字体的元素)具有真正固定的字符宽度?

我检查了 Chrome 和 Firefox,它们都扩展了特殊字符的宽度。

【问题讨论】:

complete, monospaced Unicode font?的可能重复 【参考方案1】:

原因是正在应用的font-family 声明中列出的第一个字体中缺少某些字符。因此,它们将在系统中显示一些其他字体,或者显示一些不可表示字符的指示符。

例如,第一个字符仅出现在少数几种字体中,请参阅 http://www.fileformat.info/info/unicode/char/26a1/fontsupport.htm (不包括所有字体,但包括人们计算机上可能拥有的大多数字体)。

即使使用的其他字体是等宽字体,它们也可能具有不同的字符前进宽度。例如,Everson Mono 的宽度略小于DejaVu Sans Mono。等宽字体意味着在字体内,所有字符都具有相同的前进宽度。

因此,您需要使用包含您需要的所有字符的单一字体。对于这组字符,上述两种字体可能是唯一公开发行的包含所有字符的等宽字体。嗯,有unifont,不过是位图字体,设计很粗糙;在 12pt 或稍大的尺寸下看起来可以接受。

【讨论】:

【参考方案2】:

扩展字符的不是浏览器,而是字体定义本身。我怀疑是否存在包含所有这些字符并以相同宽度定义它们的 true 等宽字体,但这正是您应该寻找的。请参阅this question 了解有关此功能可能不可用的更多详细信息。

【讨论】:

我希望可以告诉浏览器在字符比常规字符宽的情况下将其截断。这就是我的终端使用完全相同的字体所做的事情。这看起来不太理想,但它提供了一致的线宽。 不,浏览器不会这样做。【参考方案3】:

在每个特殊字符周围添加一个span,并为所有span 元素设置一个固定宽度。

示例 CSS:

pre .specialchar 
   display:inline-block;
   width: 8.7px;  /* Find the right value */

示例 html

<pre>Test 123 AAA 123
Test 123 <span class="specialchar">▶</span><span class="specialchar">▶</span><span class="specialchar">▶</span> 123</pre>

每个字符的宽度相同:

【讨论】:

以上是关于如何在具有保留字符宽度的 HTML 中使用等宽字体显示特殊的 unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 中列出等宽(固定宽度)字体

哪些英文字体每个字母的宽度都是一样的?

等宽字体的介绍

如何在 Android 文本视图中设置字体宽度?

浏览器使用哪种等宽字体?

如何设置 <div> 的宽度以适应等宽字体中的常量字母数?