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

标签 unicode fonts

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

65 == A

现在让我们考虑印地语。代码点 0x0924 代表 ,同样易于映射。

0x0924 == त

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

0x0924 0x094d 0x0930 != त ् र

但是

0x0924 0x094d 0x0930 == त्र

我的问题是。

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

最佳答案

欢迎使用现代字体:它们不是您想象的那样。 “一个代码点映射一个字母”的时代已经是 20 年前的事了,现代字体在过去的几十年里所做的远不止于此。我将用 OpenType 来解释这一点字体(大多数人称之为“ttf”和“otf”字体。是的,它们是相同的字体,它们只是字形轮廓编码不同,这是现代字体中最不值得注意的部分),因为那就是那种您最有可能使用的,在这种情况下:字体几乎控制一切,而您所依赖的文本引擎只需遵循其说明即可。

OpenType 字体有 "Character Map"它提供了(所有)从输入字节代码到可用字形列表中某个字形(“形状”)的简单一对一映射。 (请注意,这定义字体的“存在哪些字形”,它说明哪些字形直接与单个字符代码(例如单个 ASCII 字节或 Unicode 代码点)匹配. 可能还有数千个用于合成、或多代码点替换等的字形,这些字形无法通过字符映射表解析)。

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

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

  1. OpenType 具有完全的连字控制,因此仅仅因为代码 X 生成字形 GX,代码 Y 生成字形 GY,并不意味着 X + Y 将生成 GX + GY。可能有多种不同类型的连字(一对一、多对一、上下文、基于位置等),它们都由 GSUB 控制。表,(“GSUB”代表“G”lyph“SUB”位置)。当您键入多个印地语共振峰并且它们形成一个“字母”时,这就是 GSUB 的作用。例如,如果我输入“f”+“i”,那么在设计良好的字体中,您很可能会看到单个连字 fi。同样,如果您正在编写阿拉伯语,其中字母根据其在单词中的位置而具有不同的形状,GSUB 也涵盖了这一点。 GSUB 表可以包含数百个不同的规则集,以确保其适用于所有语言都能正确呈现。
  2. 是的,但与其说它是一个“程序”,不如说它是一个字体。现代字体有点像游戏 ROM,因为您需要一个引擎来执行它们,但它们是所有的主宰并包含所有的逻辑。文本渲染引擎只是简单地“嘿字体,我有这个字节序列作为输入,请指导我如何将其转换为轮廓向量”,并且字体包含有关需要发生的情况的所有信息。
  3. “使用字体软件”。这是一个显而易见的答案:好的字体是用软件制作的,它可以让您完成所有需要做的事情,以便您想要的语言支持发挥作用。 FontForge , FontStudio , FontCreator等等,以及用于优化字体所需的所有 OpenType 功能的附加工具(数量之多令人难以置信)。

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

关于Unicode 代码点到字体符号的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35540700/

相关文章:

java - 在 Java 中嵌入字体

macos - 如何转换 LWFN 于 TTF?

unicode - 什么是默认的 VB6 字符集?

python - 有没有办法以编程方式将韩文 unicode 合并为一个?

css - Font Awesome 5 字体系列问题

iPhone UIFont 粗体字体 带名称

regex - 如何使用 XSLT 中的 RegEx 检查 xml textnode 是否包含中文字符

c++ - C++ 上的 UNICODE (fread) 读取文件错误

Javascript:非 unicode 字符代码到 unicode 字符?

安卓斜体字体