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

Unicode代码点到字体符号映射?,unicode,fonts,Unicode,Fonts,我们知道代码点65表示A。有一对一映射,因此很容易渲染。从字体文件中获取符号并渲染它 65 == A 现在我们来考虑一下印地语。代码点0x0924表示त,同样易于映射 0x0924 == त 但是,如果代码点0x0924后面紧跟着表示्和र分别表示,表示不是这3个符号的组合,而是一个新符号त्र 0x0924 0x094d 0x0930 != त ् र 但是 我的问题是 哪个程序负责指示代码点的分组将创建新符号,而不是符号的集合 键入时,当由于键入而附加新的代码点时,同一程序是否监视和输

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

65 == A
现在我们来考虑一下印地语。代码点0x0924表示,同样易于映射

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

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

我的问题是

  • 哪个程序负责指示代码点的分组将创建新符号,而不是符号的集合
  • 键入时,当由于键入而附加新的代码点时,同一程序是否监视和输入以动态更改已呈现的符号
  • 如何为这些规则创建字体

  • 欢迎使用现代字体:它们不是你所想的。“一个代码点映射到一个字母”的时代是20年前的事了,在过去几十年中,现代字体的作用远远不止于此。我将用字体来解释这一点(大多数人称之为“ttf”和“otf”字体。是的,它们是相同的字体,只是它们的字形轮廓编码不同,这是现代字体中最不值得注意的部分),因为这是你最可能使用的字体,在这种情况下:字体几乎控制一切,而您所依赖的文本引擎只是按照它的指令进行操作

    OpenType字体有一个(全部)简单的一对一映射,从输入字节码到可用字形列表中的某个字形(“形状”)

    它们可以有多个映射,因为ASCII中的代码与某些Windows代码页、Mac语言/编码对或Unicode(仅包含前127个字符的ASCII)中的代码不同

    然而,将二进制代码映射到其他二进制代码非常简单。现代字体(尤其是OpenType)的真正威力在于接下来会发生什么

  • OpenType具有完全的连字控制,所以仅仅因为代码X产生glyph GX,代码Y产生glyph GY,并不意味着X+Y将产生GX+GY。可能有很多不同类型的连字(一对一、多对一、上下文、基于位置等),它们都由表格控制(“GSUB”代表“G”lyph“SUB”结构)。当你输入多个印地语共振峰,它们形成一个“字母”时,这就是GSUB所做的。例如,如果我输入“f”+“I”,很有可能在设计良好的字体中看到单个连字。类似地,如果你写的是阿拉伯语,字母的形状根据它们在单词中的位置而不同,GSUB也涵盖了这一点。GSUB表可以包含数百个不同的规则集,以确保它用于所有渲染的语言正确
  • 是的,但与其说它是一个“程序”,不如说它是字体。现代字体有点像游戏ROM,因为你需要一个引擎来执行它们,但它们决定一切,包含所有逻辑。文本呈现引擎只是简单地显示“嘿,字体,我有这个字节序列作为输入,请告诉我如何将其转换为大纲向量”,字体包含所有需要发生的信息
  • “使用字体软件”。这是一个显而易见的答案:好的字体是用软件制作的,它可以让你做所有你需要做的事情,以便你的预期语言支持工作,等等,并使用其他工具来优化字体所需的所有OpenType功能(数量多得令人难以置信)

  • 制作好字体,甚至只是对它们进行编程(因此根本不考虑字体设计)都是一项非常专业的工作。

    假设我只想编辑现有的TTF文件,更改GSUB映射代码点或字形的字符映射。哪个工具更好?第一个错误是假设这是一个“公正”,第二个错误是GSUB is规则不是关于映射代码点的。第三,你绝对不需要改变字形的字符映射。忽略所有这些,这将是疯狂的,任何链接工具都有自己的方式让您编辑OpenType功能,并且它们都有自己的方式来做事情,这些方式都同样“您需要学习如何做”。所以,你挑吧,祝你好运。
    0x0924 0x094d 0x0930 == त्र