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

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

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

这就是为什么我想获取字体提供的所有字符(下载字体,以便我可以直接处理文件或 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 字符提供了字形。

ios objective-c fonts uifont emoji
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.