如何阻止 NSTextView 显示指定字体不支持的字符

How to stop NSTextView from displaying characters that are not supported in a specified font

当显示字符串中的某些字符在指定字体中不可用时,我正在寻找一种方法来阻止 NSTextView 回退到级联字体。

我正在编写一个应用程序,在该应用程序中,重要的是用户知道特定字符(例如东亚字符集中的字符)在给定字体中是否可用。如果这些字符不可用,我希望该字段将它们显示为方框、空格或类似内容。但是,默认情况下,textview 会退回到支持字符的级联字体。有什么办法可以改变这种行为吗?

如果这不可能,是否有某种方法可以检测给定字体支持哪些语言?

如有任何帮助,我们将不胜感激。

我能够通过创建部分基于 的扩展来使其工作。

我最终使用的解决方案是遍历有问题的字符串中的每个字符,并检查它是否包含在字体的字符集中。如果不是,则在将其添加到包含原始字符串的所有字符的属性字符串之前更改外观(在这种情况下,更改颜色并添加删除线)。

这是最终的样子:

extension UnicodeScalar {
    func isIn(font:NSFont)-> Bool {
        let coreFont:CTFont = font
        let charSet:CharacterSet = CTFontCopyCharacterSet(coreFont) as CharacterSet
        if charSet.contains(self) {
            return true
        }
        return false
    }
}

extension NSFont {
    func supportString(_ str:String)-> NSAttributedString {
        let attString = NSMutableAttributedString(string: "")
        for scalar in str.unicodeScalars {
            if !scalar.isIn(font: self) {
                let r:CGFloat = 200
                let g:CGFloat = 0
                let b:CGFloat = 0
                let a:CGFloat = 0.2
                let color = NSColor(red: r, green: g, blue: b, alpha: a)
                let attcha = NSMutableAttributedString(string: String(scalar), attributes: [NSAttributedStringKey.foregroundColor:color, NSAttributedStringKey.strikethroughStyle:NSUnderlineStyle.styleSingle.rawValue])
                attString.append(attcha)
            } else {
                let attcha = NSAttributedString(string: String(scalar), attributes: [NSAttributedStringKey.foregroundColor:NSColor.black])
                attString.append(attcha)
            }
        }
        return attString
    }
}