这个问题与CoreText(在苹果平台上可用)有关.语言是Swift 5.10.

如果给定的UniChar数组包含汉字/表情符号,则CTFontCreateUIFontForLanguage()似乎不会返回可用的结果.

我的try :

假设我使用以下SWIFT脚本使用CTFontCreateUIFontForLanguage().

#!/usr/bin/env swift

import CoreText
import Foundation

guard let osFont = CTFontCreateUIFontForLanguage(
  .system, 14, "zh-Hant" as CFString
) else {
  print("CTFont initiation failed.")
  exit(1) // Abortion.
}

extension CTFont {
  func glyphs(for string: String) -> [CGGlyph]? {
    let arrUTF16 = Array(string.utf16)
    var glyphs = [CGGlyph](repeating: 0, count: arrUTF16.count)
    let result = CTFontGetGlyphsForCharacters(self, arrUTF16, &glyphs, arrUTF16.count)
    return result ? glyphs : nil
  }
}

let string = "這是草莓蛋糕🍓🍰." // NOTE: Edit this line to try various parameters.
let unichars = Array(string.utf16)

var fetchedGlyphs: [CGGlyph]? = osFont.glyphs(for: string)
guard var fetchedGlyphs = fetchedGlyphs else {
  print("Screwed. I don't know why it only works with ASCII glyphs.")
  exit(1) // Abortion.
}

请注意,CTFont可以替换为NSFont.systemFont(ofSize: NSFont.systemFontSize),而不是我在上面创建的字体.CTFont和NSFont在SWIFT 5中是免费桥接的.

此案的问题在于:

如果给定的字符串参数包含汉字和/或表情字符,则(CTFont instance).glyphs(for:)返回nil.可以try 使用其他仅支持汉字的字符串或仅支持表情符号的字符串.

推荐答案

您应该使用CTFontCreateForString或其对应的init.这会在字体级联列表中查找字体,并找到在给定字符串中支持尽可能多的字符的字体.

let string = "你好"
let baseFont = CTFont(.system, size: 14)
let osFont = CTFont(font: baseFont, string: string as CFString, range: CFRange(location: 0, length: string.utf16.count))
if let fetchedGlyphs = osFont.glyphs(for: string) {
    print(fetchedGlyphs)
}

Swift相关问答推荐

如何使用快速宏用来自函数的关联值来初始化枚举?

变量捕获:变量在函数闭包中的行为

如何在SWIFT中轻松格式化公制和英制使用的UnitVolume

如何将函数参数(字符串文字)标记为可本地化?

如何在macOS中延迟退出应用程序的退出操作?

为什么这个快速代码不显示文本字段?

使 tabview 垂直将视图移动到右侧 swift ui

物理主体未与 spritekit Swift 的网格图案上的纹理图像对齐

如何从UIKit中的AttributeContainer获取属性并将其分配给某个变量

如何在 SwiftUI 中将图像传递到 2 个视图

SwiftUI Grid 中的数组旋转

如何在 RxSwift 中获取 controlEvent 类型?

获取 SwiftUI 中 Binding 的值更改更新

swift中的SequenceType和CollectionType有什么区别?

在 Swift 中强制崩溃的最简单方法

UITableViewCell 不显示 detailTextLabel.text - Swift

如何在 Swift 中将 NSURL 转换为字符串

在 Swift 中覆盖 UIScrollView 的委托属性(就像 UICollectionView 一样)

在 Swift 中子类化 NSObject - 初始化器的最佳实践

swift中的匿名类