连字简述

程序员专属-极客T恤

今天有个朋友像发现新大陆式跟我说,当他输入wifi这个字母时,fi会合成一个字。我装作很懂的样子,说这个叫连字(合字),跟你用的字体有关,然后自己赶紧搜索了一波。


合字、连字、连结字或合体字(英语:Ligature),在西方字体排印学中一般表示将多于一个字母的合成一个字形。如印刷品中常常将拉丁字母两个字母fi的i上一点常与f的一钩合并,而德语字母ß原为ss等等。汉字的合字在不同情况下也称作合文或合体字,例如,武则天的“曌”就是个合字,有些输入法打不出的字,也只能靠合字。

为什么会出现合字?

首先一个重要原因:字形与字形之间不能和睦相处。例如,大多数衬线字体中的 f 和 i ,字母i上的点会抵挡到字母f的弧形勾,无法正确排印,所以干脆就制造一个合字铅字,把i的点融入f的勾来直接使用。这就是连字。如”fi”、”fl”、”ffi”:

还有一种所谓的酌情连字,纯粹是一种让设计上具有特点风格,并非因为某些字符相邻会产生干扰。如:”st”、”ct”:

连字对编程有什么影响?

通常情况下,程序员的IDE、编辑器使用的是等宽字体,不会有连字出现。而浏览器通常情况下也不会使用连字,但如果你想使用连字,可以通过Unicode中连字字符编码来实现,比如输入 fi可以得到fi的连字字符。

这里推荐一个Unicode字符搜索网站:http://graphemica.com/,你只要输入’fi’,就会得到连字编码:http://graphemica.com/fi

当然,这种编码的方案有好些个缺点:

  • 显然,它让HTML结构层的代码变得很不好读,而且不好写。(你肯定不认识U+FB01 是什么字符)。
  • 如果当前字体并没有为连字字符设计样式,U+FB01与正常显示效果没差别,这就失去用使用编码的意义。
  • 并不是所有连字效果都有一个对应的、标准的Unicode字符。
  • 字符编码会破坏文本的可访问性,包括对文本的复制、粘贴、搜索。你总不希望复制wifi这个单词时,出现wifi

解决方案

在CSS字体V3(http://w3.org/TR/css3-fonts)中,原有的font-variant被升级成了一个简写属性,由很多新的展开式属性组合而成,其中之一叫作font-variant-ligatures,专门用来控制连字效果的开启和关闭,如果要启动所有可能的连字,需要同时指定这三个标识符:


font-variant-ligatures: common-ligatures
discretionary-ligatures
historical-ligatures;

最后,连字欣赏:

参考资料: