如何检查字体是否支持字符

How to check if a character is supported by a font

提问人:Morniak 提问时间:4/17/2014 更新时间:11/17/2023 访问量:3894

问:

我正在开发一个带有文本字段的应用程序。在此字段中写的文本将被打印出来,我对表情符号、汉字等某些字符有疑问......因为字体不提供这些字符。

这就是为什么我想获取字体提供的所有字符(下载字体,以便我可以直接处理文件或 UIFont 对象)。

我听说过,但我不确定这个功能是否能做我想做的事,我无法让它工作。CTFontGetGlyphsForCharacters

这是我的代码:

CTFontRef fontRef = CTFontCreateWithName((CFStringRef)font.fontName, font.pointSize, NULL);
NSString *characters = @"🐯"; // emoji character
NSUInteger count = characters.length;
CGGlyph glyphs[count];
if (CTFontGetGlyphsForCharacters(fontRef, (const unichar*)[characters cStringUsingEncoding:NSUTF8StringEncoding], glyphs, count) == false)
    NSLog(@"CTFontGetGlyphsForCharacters failed.");

这里返回 false。这是我想要的,因为所使用的字体不提供字符“🐯”。
问题是当我替换时,再次返回 false。显然,我的字体为所有 ASCII 字符提供了一个字形。
CTFontGetGlyphsForCharactersNSString *characters = @"🐯"NSString *characters = @"abc"CTFontGetGlyphsForCharacters

iOS Objective-C 字体 UIFont 表情符号

评论

1赞 rmaddy 4/17/2014
如何判断特定字体是否具有特定字形的可能重复 >64k
0赞 smirkingman 4/28/2014
您尝试使用“abc”。你试过使用单个字符“a”吗?
0赞 Morniak 4/28/2014
是的,但我得到相同的结果。

答:

9赞 Morniak 4/28/2014 #1

我终于解决了它:

- (BOOL)isCharacter:(unichar)character supportedByFont:(UIFont *)aFont
{
    UniChar characters[] = { character };
    CGGlyph glyphs[1] = { };
    CTFontRef ctFont = CTFontCreateWithName((CFStringRef)aFont.fontName, aFont.pointSize, NULL);
    BOOL ret = CTFontGetGlyphsForCharacters(ctFont, characters, glyphs, 1);
    CFRelease(ctFont);
    return ret;
}

评论

3赞 binarymochi 5/29/2014
可以肯定的是,即使在 ARC 中,您仍然需要在返回之前对该字体进行 CFRelease 处理。CF 类型不受 ARC 的影响。
0赞 Reuben Scratton 12/14/2017
当然,这一切都意味着CTFontGetGlyphsForCharacters中的错误?您不必每次都创建 CTFont...