Unicode码点与字体符号映射?

9
我们知道代码点65代表A。由于存在一对一的映射,因此很容易呈现出来。只需从字体文件中取出符号A并呈现即可。
65 == A

现在让我们考虑印地语。代码点0x0924代表,很容易对应。
0x0924 == त

但是,如果代码点0x0924紧随代码点0x094d0x0930,分别表示,那么它们的组合不是这三个字符的组合,而是一个新的符号त्र

0x0924 0x094d 0x0930 != त ् र

但是
0x0924 0x094d 0x0930 == त्र

我的问题如下:

  1. 哪个程序负责指示代码点分组将创建新符号,而不是符号的连接。
  2. 在输入时,同一程序是否监视并动态更改已渲染的符号,当由于输入而追加新代码点时。
  3. 如何为这些规则创建字体?
1个回答

17
欢迎来到现代字体:它们不是你想象的那样。 "一个码点对应一个字母" 的日子已经过去了 20 年,现代字体在过去几十年中一直做得比那更多。我将以 OpenType 字体(大多数人称为 "ttf" 和 "otf" 字体。是的,它们是相同的字体,它们只在其字形轮廓编码上有所不同,这是现代字体中最不显眼的部分)来解释这个问题,因为这是您最有可能使用的类型,在这种情况下:字体几乎控制着 一切,而您依赖的文本引擎只是按照其指令执行。
OpenType字体具有"字符映射表", 它提供了从输入字节码到某个可用字形(“形状”)的简单一对一映射。请注意,这并没有定义字体中“存在哪些字形”,它仅表示与单个字符代码(例如单个ASCII字节或Unicode代码点)直接匹配的字形是哪些。可能会有成千上万的字形用于合成或多代码点替换等,这些字形无法通过字符映射表解析。

此外,一个字体可以(而且通常会)包含多个映射,因为不同的历史和当前字符集(ASCII,EUC-KR,ISO2022-JP,Unicode等等)对相同字母/符号不使用相同的代码。当然,如果它们有任何共享的话。

虽然将二进制代码映射到其他二进制代码非常简单,但现代字体,特别是OpenType的真正威力在于接下来发生了什么。

  1. OpenType具有完整的连字控制,因此仅因为代码X生成字形GX,代码Y生成字形GY,并不意味着X + Y将生成GX + GY。有很多不同类型的连字可能(一对一,多对一,上下文,基于位置等),它们都由GSUB表(“GSUB”代表“G”lyph“SUB”stitution)控制。当您输入多个印地语格式并形成单个“字母”时,这是GSUB的作用。例如,如果我键入“f”+“i”,那么在设计良好的字体中,您很有可能看到单个连字fi。同样,在编写阿拉伯语时,字母的形状取决于它们在单词中的位置,这也包含在GSUB中。GSUB表可以包含数百种不同的规则集,以确保其预期支持的所有语言都正确呈现。
  2. 是的,但它不太像一个“程序”,而更像一个字体。现代字体有点像游戏ROM,因为您需要一个引擎来执行它们,但它们调用所有指令并包含所有逻辑。文本渲染引擎只需说“嘿,字体,我有这个字节序列作为输入,请告诉我如何将其转换为轮廓向量”,而字体包含有关需要发生的所有信息。
  3. “使用字体软件”。这是一个很明显的答案:好的字体是使用可以让您执行所有必要操作以使您打算支持的语言正常工作的软件制作的。 FontForgeFontStudioFontCreator等等,还有用于优化字体所需的所有OpenType功能的其他工具(有很多)。
制作好的字体,即使只是编程(不考虑字体设计),也是一项相当专业的工作。

假设我只想编辑现有的TTF文件,更改字形的GSUB映射代码点或字符映射。哪个工具更好? - Pavan Kumar
3
第一个错误是认为这只是“仅仅”,第二个错误是GSUB规则不是关于映射代码点的。第三个错误是你绝对不应该需要改变字形的字符映射表。忽略所有这些,那将是疯狂的,任何链接的工具都有自己的方法让你编辑OpenType特性,它们都有自己的做事方式,这些方式都同样需要“学习如何做到这一点”。所以选择你喜欢的,祝你好运。 - Mike 'Pomax' Kamermans

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