这个问题与CoreText(在Apple平台上可用)有关。语言是
Swift 5.10
。
如果给定的 UniChar 数组包含汉字/表情符号,
CTFontCreateUIFontForLanguage()
似乎不会返回可用的结果。
假设我使用以下 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 可以替换为
,而不是我上面创建的。 CTFont 和 NSFont 在 Swift 5 中可免费桥接。NSFont.systemFont(ofSize: NSFont.systemFontSize)
如果给定的字符串参数包含汉字和/或表情符号字符,则
(CTFont instance).glyphs(for:)
返回 nil。您可以尝试使用其他仅包含汉字的字符串或仅包含表情符号的字符串。
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)
}