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

5
我正在开发一款带文本字段的应用程序。在该字段中输入的文本将被打印,但我遇到了一些字符问题,如表情符号、汉字等,因为字体不提供这些字符。
这就是为什么我想获取由字体提供的所有字符(该字体已下载,因此我可以直接处理文件或使用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.");

在这里,CTFontGetGlyphsForCharacters返回false。这正是我想要的,因为字体不包含字符“”。
问题出现在我将NSString *characters = @""替换为NSString *characters = @"abc"时,CTFontGetGlyphsForCharacters再次返回false。显然,我的字体对所有ASCII字符都提供了字形。


1
可能是重复的问题:如何判断特定字体是否具有>64k的特定字形 - rmaddy
你已经尝试过 'abc' 了。你尝试过单个字符 'a' 了吗? - smirkingman
是的,但我得到了相同的结果。 - Morniak
1个回答

9
我终于解决了它:
- (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
即使在 ARC 中,你仍然需要在返回之前 CFRelease 那个字体。CF 类型不受 ARC 影响。 - binarymochi
这是否意味着CTFontGetGlyphsForCharacters存在漏洞?您不应该每次都需要创建CTFont... - Reuben Scratton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接