2010-08-27 99 views
31

我在想,Unicode中的每个字符都有一个代码点;字体中字符的类似术语是什么?如何将Unicode字符映射到字体中的字形?

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

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

字体包含它有什么符号的元信息?

如果2个字体都具有符号alpha,他们是否必须共享相同的“代码点”?还是取决于字体的类型,如Type1,Type3,TrueType,OpenType? ...

感谢任何指针或引用。

回答

28

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

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

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

苹果的开发者文档,对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

我也推荐一个名为的应用程序,它为您提供了许多有关字体的有趣信息。具体查看Tools/Unicode Summary,字体/字体分析实用程序和字体/字体信息,您可以在其中将整个字形映射表提取到剪贴板。

+0

谢谢。好答案! – SeniorLee 2014-07-02 00:55:26

+0

是针对给定语言中的字符标准化的代码点吗?就像在X国做一些委员会聚会并决定,让我们使用代码点a,b,c,d ...为我们的角色提供东西东西......?然后将其提交给一些ISO? – 2016-04-27 10:14:47

+0

@ v.oddou是的,确切地说,http://unicode.org是委员会,你可以看到不同语言的各种字符集的布局方式:https://en.wikipedia.org/wiki/ Plane_%28Unicode%29和这里的ISO关系:https://en.wikipedia.org/wiki/Universal_Coded_Character_Set – 2016-04-30 00:45:52