Unicode 字符如何映射到字体中的字形?

Posted

技术标签:

【中文标题】Unicode 字符如何映射到字体中的字形?【英文标题】:How does a Unicode character get mapped to a glyph in a font? 【发布时间】:2011-04-04 17:17:02 【问题描述】:

我想知道,Unicode 中的每个字符都有一个代码点;字体中的字符的类似术语是什么?

当解码文件需要映射到字体(或字体,通过一些现代字体替换技术)时,我从来不理解该过程的一部分。

例如,当文本编辑器从其字符编码解码文件时,假设有希腊字母 α (U+03B1)。这个应用程序在字体中选择特定字形的确切过程是什么?大多数应用程序都有首选字体。假设它是快递。 (如果是罕见的 Unicode 字符,如心脏 ♥ (U+2665),它不在默认字体中,会发生什么情况?应用程序如何知道字体不包含该字符?)

字体是否包含有关它具有哪些符号的元信息?

如果 2 种字体都具有符号 alpha,它们是否必然共享相同的“代码点”?还是依赖于Type1、Type3、TrueType、OpenType等字体类型? ...

感谢任何指针或参考。

【问题讨论】:

【参考方案1】:

TrueType 字体由多个部分组成,对于这个问题,最重要的是一个“字形”表格和一个用于将字符映射到这些字形的表格(“cmap”)。

长话短说,操作系统使用“cmap”表将字符转换为字形索引,用默认字形替换任何没有匹配条目的字形。不幸的是,字体文件规范有多个版本(更不用说不同类型的字体)和这些表中相同映射的不同字符编码,因此进行映射的实际过程,并有效地进行,以便文本绘制速度快, 最终变得非常复杂。

“代码点”完全独立于字符、编码和字体。一个特定的代码点是通用的,但它有许多编码(UTF-8、UTF-16 等),它会映射到不同字体的不同字形索引。

Apple 的开发者文档中有一个关于 TrueType 字体细节的非常好的部分:

http://developer.apple.com/fonts/ttrefman/

具体来说:

字形表:https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html

人物图:https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cmap.html

我还推荐一个名为BabelMap 的应用程序,它为您提供了很多关于字体的有趣信息。具体查看 Tools/Unicode Summary、Fonts/Font Analysis Utility 和 Fonts/Font Information,您可以在其中将整个字形映射表提取到剪贴板。

【讨论】:

是否为给定语言中的字符标准化了代码点?就像某天在 X 国举行一些委员会会议并决定,让我们为我们的角色使用代码点 a、b、c、d ......然后将其提交给一些 ISO ? @v.oddou 是的,确切地说,unicode.org 是委员会,您可以在此处查看不同语言的各种字符集的布局方式:en.wikipedia.org/wiki/Plane_%28Unicode%29 以及此处的 ISO 关系: en.wikipedia.org/wiki/Universal_Coded_Character_Set

以上是关于Unicode 字符如何映射到字体中的字形?的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有包含所有 Unicode 字形的字体? [关闭]

在基于 Debian 的系统上,如何找到字体具有字形的 Unicode 代码点?

如何在 Windows 文档中使用特殊字符

在 iPhone 上绘制 Unicode 字符

CoreText:行 CTLineRef

字形在 Swift 中带有 ttf 文件