Как получить все символы шрифта с помощью CTFontCopyCharacterSet () в Swift?

Более ранние ответы подходят. Но я также хотел бы указать на более общую проблему.

Я столкнулся с подобной проблемой, и причиной было сетевое ограничение моей компании.

То же соединение получало успех, когда я был в любой другой сети.

1
задан l --marc l 27 June 2019 в 21:26
поделиться

2 ответа

CFCharacterSet является бесплатной связью с аналогом Cocoa Foundation NSCharacterSet и может быть соединена с соответствующим типом значения Swift CharacterSet:

let charset = CTFontCopyCharacterSet(ctFont) as CharacterSet

Тогда подход из NSArray из NSCharacterSet можно использовать для перечисления всех скалярных значений Unicode этого набора символов (включая точки, отличные от BMP, т.е. скалярные значения Unicode, превышающие U + FFFF).

CTFontGetGlyphsForCharacters() ожидает, что символы не-BMP являются суррогатной парой, то есть массивом кодовых единиц UTF-16.

Если сложить все вместе, функция будет выглядеть так:

func createUnicodeFontMap(ctFont: CTFont) ->  [CGGlyph : UnicodeScalar] {

    let charset = CTFontCopyCharacterSet(ctFont) as CharacterSet

    var glyphToUnicode = [CGGlyph : UnicodeScalar]() // Start with empty map.

    // Enumerate all Unicode scalar values from the character set:
    for plane: UInt8 in 0...16 where charset.hasMember(inPlane: plane) {
        for unicode in UTF32Char(plane) << 16 ..< UTF32Char(plane + 1) << 16 {
            if let uniChar = UnicodeScalar(unicode), charset.contains(uniChar) {

                // Get glyph for this `uniChar` ...
                let utf16 = Array(uniChar.utf16)
                var glyphs = [CGGlyph](repeating: 0, count: utf16.count)
                if CTFontGetGlyphsForCharacters(ctFont, utf16, &glyphs, utf16.count) {
                    // ... and add it to the map.
                    glyphToUnicode[glyphs[0]] = uniChar
                }
            }
        }
    }

    return glyphToUnicode
}
1
ответ дан Martin R 27 June 2019 в 21:26
поделиться

Вы можете сделать что-то вроде этого.

let cs = CTFontCopyCharacterSet(font) as NSCharacterSet
let bitmapRepresentation = cs.bitmapRepresentation

Формат растрового изображения определен на странице ссылки для CFCharacterSetCreateWithBitmapRepresentation

1
ответ дан idz 27 June 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: