Unicode代码点到字体符号映射?

时间:2016-02-21 19:12:28

标签: unicode fonts

我们知道代码点65代表A。有一对一的映射,因此很容易渲染。从字体文件中取符号A并渲染它。

65 == A

现在让我们考虑一下印地语。代码点0x0924代表,再次易于映射。

0x0924 == त

但是,如果代码点0x0924后面紧跟着分别代表0x094d0x0930的代码点,则表示不是组合这3个中有一个新符号त्र

0x0924 0x094d 0x0930 != त ् र

但是

0x0924 0x094d 0x0930 == त्र

我的问题是。

  1. 哪个程序负责指示代码点的分组将创建新的符号,但不是符号的连续。
  2. 键入内容时,相同程序会监视并输入以在因输入而附加新代码点时动态更改已呈现的符号
  3. 如何为此类规则创建字体?

1 个答案:

答案 0 :(得分:7)

欢迎使用现代字体:它们不是您的想法。 “一个代码点映射到一个字母”的日子是20年前的样子,现代字体在过去的几十年里一直在做更多的事情。我将用OpenType字体解释这个问题(大多数人称之为“ttf”和“otf”字体。是的,它们都是OpenType字体),因为这是你最有可能使用的那种,在这种情况下:字体几乎控制所有内容,而您所依赖的文本引擎只是遵循其指示。

OpenType字体有"Character Map",它提供(所有)从输入字节代码到可用字形列表中某处的某些字形(“形状”)的简单一对一映射。

并且它们可以有多个映射,因为ASCII中的代码与某些Windows代码页中的代码,或Mac语言/编码对或Unicode(仅覆盖前127个字符的ASCII,甚至是然后相当)。

然而,将二进制代码映射到其他二进制代码非常简单。现代字体的真正力量,特别是OpenType,就是接下来发生的事情。

  1. OpenType具有完全的连字控制,因为代码X产生字形GX而代码Y产生字形GY,绝不意味着X + Y将产生GX + GY。可能存在相当多种不同的连字(一对一,多对一,上下文,基于位置等),并且它们都由GSUB表控制(“GSUB” “for”G“lyph”SUB“stitution)。当你键入多个印地语共振峰并形成一个单独的“字母”时,这就是GSUB所做的。例如,如果我键入“f”+“i”,很有可能在设计良好的字体中,您会看到单个连字。同样地,如果您正在编写阿拉伯语,其中字母具有不同的形状,具体取决于它们在一个单词中的位置,这也是GSUB所涵盖的。 GSUB表可以包含数百种不同的规则集,以确保所有语言都能正确呈现。
  2. 是的,但它不像字体那么“程序”。现代字体有点像游戏ROM,因为你需要一个引擎来执行它们,但它们会调用所有镜头并包含所有逻辑。文本渲染引擎只是“嘿字体,我有这个字节序列作为输入,请指导我如何将其转换为轮廓矢量”,字体包含所有需要发生的信息。
  3. “使用字体软件”。这是一个明显的答案:良好的字体是用软件制作的,它可以让你做所有你需要做的事情,以便你的语言支持工作。 FontForgeFontStudioFontCreator等等,还有其他工具可用于优化字体所需的所有OpenType功能(非常多)。
  4. 制作好的字体,甚至只是对它们进行编程(因此根本不考虑字体设计)是一项非常专业的工作。