如何让CTFontCreateUIFontForLanguage与汉字和表情符号一起使用?

问题描述 投票:0回答:1

这个问题与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 可以替换为

NSFont.systemFont(ofSize: NSFont.systemFontSize)
,而不是我上面创建的。 CTFont 和 NSFont 在 Swift 5 中可免费桥接。

案例中的问题:

如果给定的字符串参数包含汉字和/或表情符号字符,则

(CTFont instance).glyphs(for:)
返回 nil。您可以尝试使用其他仅包含汉字的字符串或仅包含表情符号的字符串。

swift core-text
1个回答
1
投票

您应该使用

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.