Как проверить, поддерживается ли символ шрифтом

Я работаю над приложением с текстовым полем. Текст, написанный в этом поле, будет напечатан, и у меня есть проблема с некоторыми символами, такими как смайлики, китайские иероглифы и т. д., потому что шрифт не предоставляет эти символы.

Вот почему я хочу получить все символы, предоставленные шрифтом (шрифт загружается, поэтому я могу работать непосредственно с файлом или с объектом 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.


person Morniak    schedule 17.04.2014    source источник
comment
возможный дубликат Как определить, конкретный шрифт имеет определенный глиф ›64k   -  person rmaddy    schedule 17.04.2014
comment
Вы пытались с «abc». Вы пробовали с одним символом «а»?   -  person smirkingman    schedule 28.04.2014
comment
Да, но я получаю тот же результат.   -  person Morniak    schedule 28.04.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;
}
person Morniak    schedule 28.04.2014
comment
Почти уверен, что вам все равно нужно CFRelease этот шрифт перед возвратом, даже в ARC. Типы CF не подвержены влиянию ARC. - person binarymochi; 29.05.2014
comment
Наверняка все это подразумевает ошибку в CTFontGetGlyphsForCharacters? Вам не нужно каждый раз создавать CTFont... - person Reuben Scratton; 14.12.2017