Apple 的文本渲染如何绘制字体没有的字形?

2023-11-25

我对字体和编码有了基本的了解,但最近我不得不在我的舒适区之外做一些事情:转动字符✖(0x2716“重乘 x”)变为CGPathRef.

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

我的问题是:我可以在任何字体中使用 ✖,只需将其粘贴即可。我在 Pages 中做了一个小实验,将 ✖ 粘贴到文档中,选择它,然后不断更改字体。我做了一个类似的程序化实验。字形始终正确显示(并且从未改变)。如果这些字体中很少有 ✖,这是如何工作的?如果给定的字体没有这样的符号,是否有一些“后备字形”(我猜这将是“后备字体”)?如果是这样,有什么方法可以以编程方式访问这些字形吗?


Core Text 中的后备字体列表称为“级联列表”,它是CTFontDescriptor (the kCTFontCascadeListAttribute).

系统默认的级联列表可以通过以下方式访问CTFontCopyDefaultCascadeListForLanguages()。由于某种原因,该函数尚未在 Apple 网站上记录,但以下是“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 种字体,涵盖多种语言和符号。

您可以为自己定制级联列表/后备字体CTFont实例通过设置kCTFontCascadeListAttribute自定义的属性CTFontDescriptor到后备数组CTFontDescriptor对象。然后,将其变成CTFont with CTFontCreateWithFontDescriptor()。如果您没有在您的设备上设置自定义级联列表CTFontDescriptor,默认情况下会使用全局列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apple 的文本渲染如何绘制字体没有的字形? 的相关文章

  • API 调用时出现 UnicodeEncodeError (json)

    我正在尝试打印此 API 调用的结果 但收到 UnicodeEncodeError 可能是超级菜鸟问题 但非常感谢任何帮助 import http client import json api key hidden connection h
  • iOS7:我们可以在 Dynamic Type 中使用 Helvetica Neue 以外的字体吗?

    我们正在为 iOS7 设计一个应用程序 我们的设计师想要使用非默认字体 Avenir 但我不想失去动态类型功能 据我了解 动态类型只能与默认系统字体 Helvetica Neue 一起使用 是否可以使用其他字体 或者目前无法选择 据我了解
  • 即使我使用 SetWindowTextW(),Unicode 文本在编辑框中显示为问号

    我遇到了 unicode 文件名在编辑框中显示为问号的问题 当我将 unicode 字符 例如阿拉伯语或泰语 粘贴到编辑框中时 它们会正确显示 但在运行此代码后 它们会变成问号 怎么会 WCHAR buf 100 GetWindowText
  • 如何在不修改以前的文本的情况下更改 WPF RichTextBox 中的 FontFamily

    当您使用 RichTextBox 的 FontFamily 属性时 它会更改 FlowDocument 内整个内容的 FontFamily 就像执行 EditingCommands ToggleBold 这样的命令一样 它仅更改插入符号下的
  • 如何阻止“gem”实用程序访问我的主目录?

    当我跑步时 gem install
  • TCHAR 仍然相关吗?

    我是 Windows 编程新手 在读完 Petzold 的书后 我想知道 使用TCHAR类型和 T 函数来声明字符串或者我应该使用wchar t and L 新代码中的字符串 我将仅针对现代 Windows 截至撰写本文时版本 10 和 1
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何使用 HTML 在 IE 中显示 Unicode 字符

    我试图使用以下代码在页面底部显示版权和无穷大符号 x00A9 Copyright Mikle 2009 x221E 这在 Firefox 2 3 和 Chrome 中完美运行 不过 IE7 向我显示了实际的代码 如上所示 而不是我所期望的
  • Android 斜体字体

    我尝试在文本视图中显示斜体文本 我使用方法 TypeFace defaultFromstyle TypeFace ITALIC 但它不起作用 文本的样式未设置为斜体 如果我在 defaultFromstyle 返回时调用 getStyle
  • 在 TVML 中设置字体系列

    在我的 TVML 应用程序中 我可以使用 tv text style none 设置字体样式属性 例如字体大小和字体粗细 但是我无法设置 font family 属性 该属性似乎被忽略 var Template function retur
  • Json.dump 失败并显示“必须是 unicode,而不是 str”TypeError

    我有一个 json 文件 其中恰好有大量中文和日文 以及其他语言 字符 我将其加载到我的 python 2 7 脚本中使用io open如下 with io open multiIdName json encoding utf 8 as j
  • 渲染 TTF SDL2.0 opengl 3.1

    我正在使用 SDL2 0 并使用 半现代 opengl 3 1 我希望向我的应用程序添加文本叠加 并在应用程序中呈现 TTF 我将如何使用现代 OpenGL 来解决这个问题 编辑 根据 genpfault 的建议 我尝试使用 SDL TTF
  • 如何在 Android 上的 HttpPost 中发送 unicode 字符

    我试图在我的应用程序中允许多语言支持 这会发出 HTTP post 来上传新消息 我需要做什么才能支持日语和其他非拉丁语语言 我的代码目前看起来像这样 note the msg string is a JSON message by the
  • @fontface - 禅宗购物车中的 403 禁止错误

    我不确定这是否是发布此内容的正确位置 因为我不知道问题出在哪里 基本上 字体现在对我来说真的很痛苦 而且没有任何效果 我尝试从 google fonts 加载字体 但遇到了 IE 问题 所以我决定下载它们并自己提供服务 但现在它无法在任何浏
  • 我应该在密码中支持 Unicode 吗?

    我想允许我的用户使用 Unicode 作为密码 不过我发现很多网站不支持这一点 例如 Gmail Hotmail 所以我想知道是否有一些我忽略的技术或可用性问题 我在想 如果有什么问题的话 那一定是可用性问题 因为默认情况下 NET 接受
  • 用于生成多色文本的 jQuery 插件,该文本可在悬停时改变颜色

    我想为各种链接生成多色文本 并从预先指定的颜色数组中为各个字母随机分配颜色 当将鼠标悬停在带有文本的 div 上时 颜色会发生变化 我正在考虑一个 jQuery 插件 脚本将是可行的方法 我想知道是否存在这样的插件或近似插件 Thanks
  • JTextPane 的等宽字体/符号

    我想使用 JTextPane 构建类似控制台的输出 因此我使用等宽字体 textpane setFont new Font Font MONOSPACED Font PLAIN 12 这适用于所有类型的字母 如 a z 0 9 等 字符 但
  • Java如何区分这些具有相同名称/签名的多个方法?

    今天我在追踪一个错误 我注意到我们的一个班级中有一些奇怪的事情 我删除了尽可能多的代码并发布在这里 class A static int obtainNumber return 42 static int obtainNumber retu
  • 在python中使用编解码器utf-8打开文件错误

    我在 windows xp 和 python 2 6 4 上执行以下代码 但它显示 IOError 如何打开名称带有 utf 8 编解码器的文件 gt gt gt open unicode txt euc kr encode utf 8 T
  • ☺ 不在移动版本中呈现

    我如何获得特殊角色 笑脸在移动浏览器中正确呈现 li a href http goo gl GjxlI title target blank span style font size 20px span a li 它在大多数浏览器上显示为

随机推荐

  • 创建临时文件而不在 Ruby 中打开它

    有没有办法创建临时文件而不打开它 我必须运行一个可执行文件 将其输出重定向到一个文件 然后读取并解析它 所创造的一切tempfile已经打开 这会触发错误 因为文件被锁定 您还可以使用 Dir Tmpname Dir Tmpname cre
  • 将某些浮动数据框列格式化为 pandas 中的百分比

    我正在尝试在 IPython 笔记本中写一篇论文 但遇到了一些显示格式问题 假设我有以下数据框df 有什么办法可以格式化吗var1 and var2化为 2 位小数并var3化为百分比 var1 var2 var3 id 0 1 45831
  • 为什么我们需要多个渲染通道和子通道?

    我过去有过使用 DirectX12 的经验 但我不记得 Vulkan 中类似渲染通道的东西 所以我无法进行类比 如果我理解正确 则同一子通道内的命令缓冲区不需要同步 那么为什么要复杂化并制作多个呢 为什么我不能只使用一个命令缓冲区并将所有与
  • 将元组添加到 pandas 数据框的特定单元格

    正当我以为我已经掌握了 Python 和 Pandas 的窍门时 另一个看似简单的问题出现了 我想将元组添加到 pandas 数据框的特定单元格 这些元组需要根据数据框中其他单元格的内容即时计算 换句话说 我无法轻松地提前计算所有元组并将它
  • 仅当成功保存父对象时才保存对 has_many 关联的更改吗?

    假设每个Project has many Tasks If I do some project tasks list of tasks some project save 即使保存失败 项目的任务也会更新 如果list of tasks由新
  • 在 emacs 中将预处理器指令缩进为 C 代码

    默认情况下 Emacs 不缩进预处理器代码 我知道它有历史根源 但现在已经过时了 然而 具有大量未缩进的 ifdef 的代码很难阅读 所以我想让 emacs 自动缩进给我类似的东西 void myfunc int foo ifdef BAR
  • Python mysql.connector InternalError:关闭游标时发现未读结果

    我想从光标读取部分结果 然后关闭它而不读取所有结果 cursor close raises InternalError Unread result found 是否可以关闭游标而不迭代所有结果或使用缓冲选项 Update 我的查询得到大约
  • Visual Studio Code 无法使用“code”命令打开

    当我尝试从命令行打开 VSCode 时code 我收到错误 MacOS Electron No such file or directory 我怎样才能解决这个问题 如果您遇到以下错误 usr local bin code line 6 u
  • 在同一个 UI 中使用 QVTKWidget 和 QOpenGLWidget?

    我正在开发一个使用自定义子类的项目QOpenGLWidget显示一些效果图 结束时paintGL 它调用小部件的方法update 方法触发重绘事件 如果它可见 现在我想添加一个额外的QVTKWidget到我的用户界面 我通过使用这样的东西来
  • 在条形图中设置轴标签和刻度线的不同位置

    我想重新对齐 偏移条形图的 x 轴和相关刻度线 这应该很简单 但我很难找到答案 下面是一些包含 24 个类别的示例数据 xval c 1 24 count c 0 03 0 03 0 08 0 06 0 11 0 4 0 3 0 5 0 5
  • 为什么 Safari 不接受 GZIP 压缩?

    我这里有一个相当大的 JavaScript 文件 我想将其嵌入到我的网站中 HTTP 服务器足够智能 可以在将文件传送到浏览器之前对其进行 GZIP 不过 我用 Google Chrome 和 Safari 进行了测试 在 Chrome 上
  • spring TransactionTemplate 和 SimpleJdbcTemplate 是线程安全的吗?

    我目前正在处理的代码中 有一个单例被许多线程使用 除了 TransactionTemplate 和 SimpleJdbcTemplate 的两个字段之外没有状态 这两个字段在单例的函数中用于访问数据库 这安全吗 还是我应该在需要时创建一个新
  • ./ 和 ~/ 之间的区别

    创建文件路径和 URL 时 我注意到很多时候路径以 or 以以下开头的文件路径有什么区别 and 它们各自的含义是什么 为了完整起见 Just path是一个名为的文件或目录path在当前目录中 path是一个名为的文件或目录path在当前
  • 如何更新 Rails 语言环境 YML 文件而不丢失注释和变量?

    我正在构建一个 Ruby 脚本来更改 config locales yml Rails 语言环境文件的内容 这些文件包含许多有用的注释和变量 通过加载 更新和转储它们 我丢失了这些注释和变量 如何以编程方式更新 YAML 文件 同时保留注释
  • 分支在 ?: 运算符?

    对于现代硬件上的典型现代编译器 运算符结果会产生影响指令管道的分支吗 换句话说 调用这两种情况以避免可能的分支 哪个更快 bool testVar someValue Used later purge white purge black 或
  • 如何隐藏 Html 日历面板中的年份部分?

    有没有办法隐藏年份部分 html 日历面板 只显示日历上的月份和日期部分 不幸的是 没有简单的答案 但是您可以使用替代方法 通过使用 JavaScript 强制用户仅输入月份和日期 var year new Date getFullYear
  • 按 ID 删除数百万行的最佳方法

    我需要从 PG 数据库中删除大约 200 万行 我有一个需要删除的 ID 列表 然而 我尝试做到这一点的任何方法都需要几天的时间 我尝试将它们放入表中并以 100 为一批进行操作 4 天后 该操作仍在运行 仅删除了 2972 68 行 我必
  • 带有数字和默认键盘的 UITextField

    为 邮政编码 邮政编码 字段创建了一个 UITextField 其键盘类型为 UIKeyboardTypeDefault 我想使用默认键盘 但希望默认显示数字和符号与字母相对应 当您在 Contacts app 中输入地址时 Apple 会
  • 使用 crontab 运行脚本时无法导入 Python MySQL 模块

    我正在使用 crontab 运行需要 MySQLdb 模块的 python 脚本 当我从命令行运行此脚本时 一切正常 但是 尝试使用 crontab 运行它会引发此错误 Traceback most recent call last Fil
  • Apple 的文本渲染如何绘制字体没有的字形?

    我对字体和编码有了基本的了解 但最近我不得不在我的舒适区之外做一些事情 转动字符 0x2716 重乘 x 变为CGPathRef 我使用了核心文本CTFontGetGlyphsForCharacters来完成这项工作 我明白 一个CGGly