如何在 Swift 中使用 CTFontCopyCharacterSet() 获取字体的所有字符?

2023-12-14

如何获取字体的所有字符CTFontCopyCharacterSet()在斯威夫特? ...对于 macOS?

在实施该方法时出现了该问题OSX:CGGlyph 到 UniChar用斯威夫特回答。

func createUnicodeFontMap() {
    // Get all characters of the font with CTFontCopyCharacterSet().
    let cfCharacterSet: CFCharacterSet = CTFontCopyCharacterSet(ctFont)

    //    
    let cfCharacterSetStr = "\(cfCharacterSet)"
    print("CFCharacterSet: \(cfCharacterSet)")  

    // Map all Unicode characters to corresponding glyphs
    var unichars = [UniChar](…NYI…) // NYI: lacking unichars for CFCharacterSet
    var glyphs = [CGGlyph](repeating: 0, count: unichars.count)
    guard CTFontGetGlyphsForCharacters(
        ctFont, // font: CTFont
        &unichars, // characters: UnsafePointer<UniChar>
        &glyphs, // UnsafeMutablePointer<CGGlyph>
        unichars.count // count: CFIndex
        )
        else {
            return
    }

    // For each Unicode character and its glyph, 
    // store the mapping glyph -> Unicode in a dictionary.
    // ... NYI
}

做什么用CFCharacterSet检索实际字符一直难以捉摸。自动完成cfCharacterSet实例提供没有显示相关方法。

enter image description here

And the 核心基础 > CFCharacterSet似乎有创建另一个 CFCharacterSet 的方法,但没有提供单字符数组|列表|字符串来创建映射字典。


注意:我正在寻找一个不特定于 iOS 的解决方案,如获取字体中的所有可用字符它使用UIFont.


CFCharacterSet与可可基金会对应机构免费桥接NSCharacterSet,并且可以桥接到相应的 Swift 值类型CharacterSet:

let charset = CTFontCopyCharacterSet(ctFont) as CharacterSet

然后方法是从NSArray 来自 NSCharacterSet可用于枚举该字符集的所有 Unicode 标量值(包括非 BMP 点,即大于 U+FFFF 的 Unicode 标量值)。

The CTFontGetGlyphsForCharacters()期望非 BMP 字符作为代理对,即作为 UTF-16 代码单元的数组。

把它们放在一起,该函数将如下所示:

func createUnicodeFontMap(ctFont: CTFont) ->  [CGGlyph : UnicodeScalar] {

    let charset = CTFontCopyCharacterSet(ctFont) as CharacterSet

    var glyphToUnicode = [CGGlyph : UnicodeScalar]() // Start with empty map.

    // Enumerate all Unicode scalar values from the character set:
    for plane: UInt8 in 0...16 where charset.hasMember(inPlane: plane) {
        for unicode in UTF32Char(plane) << 16 ..< UTF32Char(plane + 1) << 16 {
            if let uniChar = UnicodeScalar(unicode), charset.contains(uniChar) {

                // Get glyph for this `uniChar` ...
                let utf16 = Array(uniChar.utf16)
                var glyphs = [CGGlyph](repeating: 0, count: utf16.count)
                if CTFontGetGlyphsForCharacters(ctFont, utf16, &glyphs, utf16.count) {
                    // ... and add it to the map.
                    glyphToUnicode[glyphs[0]] = uniChar
                }
            }
        }
    }

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

如何在 Swift 中使用 CTFontCopyCharacterSet() 获取字体的所有字符? 的相关文章

随机推荐

  • 在前台时不显示通知

    我正在使用 Firebase 管理 SDK 从节点服务器发送推送通知 但在 iOS 上 我只想在应用程序处于后台 终止时显示通知 而不是在前台时显示通知 目前它会始终显示通知 这是我的有效负载 const payload data data
  • 如何使用 AppCompat v.7 显示和隐藏 ActionBar

    我有一个显示文本的简单应用程序 该应用程序从一个带有几个选项的主屏幕开始 例如 一个导致有关该应用程序的信息的信息按钮 一个允许用户查看可以显示的所有单独文本片段的浏览按钮 主按钮通向另一个显示文本的屏幕 通过左右滑动 他可以看到不同的文本
  • FMX - Trayicon 消息处理

    我在使用 FMX XE3 Windows 设置托盘图标时遇到问题 我使用的代码可以在无数线程中找到 但我没有得到图标工作的消息处理 为了说明这一点 我创建了一个测试应用程序 它在 FormCreate 中设置 TrayIcon 数据并使用按
  • 伪元素中是什么使伪元素成为伪元素?

    在我的另一个问题中CSS 中的 伪 是什么意思 我得到了这个答案 伪元素是行为类似于元素但不是元素的东西 是什么使得伪元素不是元素 伪元素不在 dom 中 这就是它不是元素的原因 它是由 CSS 创建的元素 伪元素无法被各种技术看到或操纵
  • 使两个重叠的 div 都可点击?

    是否可以制作两个重叠的 div 并且都可以点击 我已将 div 附加到两个容器 container and container2 他们的风格一模一样 只是有一个不同flex direction column 其中之一是flex direct
  • 使用 pyodbc 从 WSL2 连接到 Windows 上的 SQL Server - 连接超时

    我正在尝试从 WSL2 连接到 Windows 上的 SQL 服务器 但收到连接超时错误 我正在使用这段代码 import pyodbc server DESKTOP LFOSSEF database sportsanalytics use
  • 如何因不活动而注销用户

    纯服务器端 PHP 每次用户提交表单时 我都会更新数据库中的 上次活动 时间 我想进行定期检查并强制注销非活动用户以释放许可证 我该怎么做呢 我是否还应该将会话 ID 存储在数据库中 然后销毁会话 这将为另一个用户释放许可证 当第一个用户最
  • 对齐捕获的深度和 RGB 图像

    之前有过提问 here here and here 与我的问题相关 但是我的问题有一个不同的方面 我在之前提出的任何问题中都没有看到过 我使用 Kinect 深度传感器获取了用于研究的数据集 该数据集采用 png 图像格式 用于特定时刻的深
  • Swagger-ui 与 Spring 安全性

    我有一个带有身份验证服务的简单 REST 应用程序 我尝试向其中添加 swagger 和 swagger ui 但我只能看到我的端点 v2 api docs In swagger ui html我只看到端点组 但无法扩展任何列表 在 chr
  • 本地化 (l10n):为我的 mozilla 插件设置默认语言

    我正在开发一个 Mozilla 插件并实现 l10n 我的问题是 如何为我的插件设置默认语言 当我的插件不支持语言时 它会切换到默认语言 当 Mozilla Firefox 的语言改变时 插件会改变它的语言环境吗 如何更改我的 Firefo
  • 图像周围的 Silverlight 文本

    我正在尝试将文本包裹在图像周围 就像使用 html float 属性一样 有没有办法在 silverlight 3 中实现这一点 Thanks 我不久前解决了这个问题 据我所知 确实没有什么好方法 这会起作用 尽管只是很痛苦 为了简化解释
  • 如何配置 PyCharm 在没有 ^space 的情况下自动完成代码?

    When typing in PyCharm I used to automatically get code completion suggestions without having to hit Ctrl Space I must h
  • 没有提升的 WCF wsdualhttpbinding 客户端

    我创建了一个 Windows 服务 服务器 和一个使用 WCF wsdualhttpbinding 回调功能的 WPF 客户端 两个软件之间的所有内容都可以正常工作 但我遇到的问题是客户端需要以管理员权限运行才能工作 这是可以理解的 因为它
  • 适用于 VB6 和 .net 应用程序的最佳 IPC

    在我们的应用程序 文档管理系统 中 我们应该收到屏幕更改的通知 或通知其他程序屏幕更改 以便使两个应用程序查看相同的数据 一个是订单履行应用程序 另一个是订单履行应用程序原始传真的文档查看器 履行应用程序是用 vb6 编写的 文档管理器是用
  • SQL Server 文件名和版本[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我很幸运能够成为一台服务器的管理员 但我不知道这台服务器上有多少个版本的sql server 当我打开Microsoft SQL Server文件时 有一些名为80 90 100 1
  • 线性渐变在 IE 11 中不起作用

    我有一个 css 规则 可以在 chrome firefox 中正常工作 并且曾经在 IE 中工作 现在我看似有效的 css 不起作用了 s tour border radius 5px margin 0 auto width 250px
  • Java HttpClient - 通过代理发布文件

    我尝试使用代理从我的网络应用程序调用外部网站 此外 还需要在此外部网站上执行 POST 请求 我正在使用 tomcat7 org apache httpcomponents 4 3 4 spring 在没有代理的情况下进行跟踪是有效的 我得
  • dropwizard 应用程序中的配置更改以与 React browserHistory 配合使用

    我有一个react应用程序运行在dropwizard服务器 这bundle js在 ui 上提供 当我打开 ui 上的 url 并导航应用程序 并转到 ui content 时 它工作正常 但是当我尝试刷新特定页面 例如 app conte
  • 在 ssrs 中显示 10 行的最大值

    我有一份报告 其中我想显示 10 名具有最高薪水的员工数据 我想通过 SSRS 来完成此操作 请帮助我 请通过 SSRS 而不是 SSMS 来完成 提前致谢 我假设您有一个数据集 每个员工一行 按工资降序排序 您可以申请一个TOP N过滤到
  • 如何在 Swift 中使用 CTFontCopyCharacterSet() 获取字体的所有字符?

    如何获取字体的所有字符CTFontCopyCharacterSet 在斯威夫特 对于 macOS 在实施该方法时出现了该问题OSX CGGlyph 到 UniChar用斯威夫特回答 func createUnicodeFontMap Get