Как да проверите дали даден знак се поддържа от даден шрифт

Работя върху приложение с текстово поле. Текстът, написан в това поле, ще бъде отпечатан и имам проблем с някои знаци като емотикони, китайски йероглифи и т.н., защото шрифтът не предоставя тези знаци.

Ето защо искам да получа всички символи, предоставени от шрифт (Шрифтът се изтегля, за да мога да работя директно с файла или с 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
Със сигурност все още трябва да освободите този шрифт от CFR, преди да се върнете, дори в ARC. Типовете CF не се влияят от ARC. - person binarymochi; 29.05.2014
comment
Със сигурност всичко това предполага грешка в CTFontGetGlyphsForCharacters? Не трябва да създавате CTFont всеки път... - person Reuben Scratton; 14.12.2017