Unicode 苹果如何';s文本呈现绘制字体不显示的字形';你没有吗?

Unicode 苹果如何';s文本呈现绘制字体不显示的字形';你没有吗?,unicode,fonts,core-text,Unicode,Fonts,Core Text,我对字体和编码有一个基本的了解,但最近我不得不做一些超出我舒适区的事情:转换字符✖ (0x2716“重乘法x”)转换为CGPathRef 我使用核心文本的CTFontGetGlyphsForCharacters来完成这项工作。我知道cglyph实际上是给定字体支持的一组glyph的索引。我很快发现,iOS上只有极少数字体支持这个字形,包括我选择的Zapf Dingbats 我的问题是:我可以使用✖ 在任何字体中,只需将其粘贴。我在粘贴的页面上做了一个小实验✖ 进入文档,选择它,然后不断更改字体。

我对字体和编码有一个基本的了解,但最近我不得不做一些超出我舒适区的事情:转换字符✖ (
0x2716
“重乘法x”)转换为
CGPathRef

我使用核心文本的
CTFontGetGlyphsForCharacters
来完成这项工作。我知道
cglyph
实际上是给定字体支持的一组glyph的索引。我很快发现,iOS上只有极少数字体支持这个字形,包括我选择的Zapf Dingbats


我的问题是:我可以使用✖ 在任何字体中,只需将其粘贴。我在粘贴的页面上做了一个小实验✖ 进入文档,选择它,然后不断更改字体。我做了一个类似的程序性实验。图示符始终正确显示(且从未更改)。如果这些字体中很少有✖, 这是怎么回事?如果给定的字体没有这样的符号,是否有一组“回退字形”(我猜是“回退字体”)?如果是这样,是否有任何方法可以通过编程访问这些字形?

核心文本中的回退字体列表称为“级联列表”,它是
CTFontDescriptor
(kCTFontCascadeListAttribute)的属性

可以使用
CTFontCopyDefaultCascadeListForLanguages()
访问系统的默认级联列表。出于某些原因,苹果的网站上尚未记录此功能,但以下是其“CTFont.h”头文件中的文档:

/*!
    @function   CTFontCopyDefaultCascadeListForLanguages
    @abstract   Return an ordered list of CTFontDescriptorRef's for font
                fallback derived from the system default fallback region
                according to the given language preferences. The style of
                the given is also matched as well as the weight and width
                of the font is not one of the system UI font, otherwise
                the UI font fallback is applied.

    @param      font
                The font reference.

    @param      languagePrefList
                The language preference list - ordered array of
                CFStringRef's of ISO language codes.

    @result     The ordered list of fallback fonts - ordered array of
                CTFontDescriptors.
*/
CFArrayRef CTFontCopyDefaultCascadeListForLanguages(
    CTFontRef font,
    CFArrayRef languagePrefList ) CT_AVAILABLE(10_8, 6_0);
在Mac OS X 10.10上,默认的英文级联列表包含26种字体,涵盖了多种语言和符号


通过将自定义
CTFontDescriptor
kCTFontCascadeListAttribute
属性设置为回退
CTFontDescriptor
对象数组,您可以为自己的
CTFontDescriptor
实例自定义级联列表/回退字体。然后,使用
CTFontCreateWithFontDescriptor()
将其转换为
CTFont
。如果未在
CTFontDescriptor
上设置自定义级联列表,则默认情况下将使用全局列表。

尝试在终端中显示此列表。终端不应该使用任何回退字体。很好!但在它确实显示的情况下,它是如何工作的?我不知道是标准API privides回退,还是应用程序必须自己做。事实证明(至少在我发表这篇评论时),苹果的终端和iTerm2实际上使用了回退字体。