CTFontGetGlyphsForCharacters возвращает false для поддерживаемого специального символа - PullRequest
0 голосов
/ 18 мая 2019

Я написал небольшую функцию на основе CTFontGetGlyphsForCharacters, чтобы проверить, поддерживается ли конкретный специальный символ, такой как ⏭, шрифтом:

public extension CTFont {
    func isCharSupported(_ char: String) -> Bool {

        if let val = char.unicodeScalars.first?.value {
            let ptr = UnsafeMutablePointer<CGGlyph>.allocate(capacity: 1)
            let result = CTFontGetGlyphsForCharacters(self, [UniChar(val)], ptr, 1)
            ptr.deallocate()
            return result
        }
        return false
    }
}

Пример вызова функции выглядит следующим образом:

internal func checkChars() {
   let font = UIFont.boldSystemFont(ofSize: UIFont.systemFontSize) as CTFont
   //let font = CTFontCreateWithName("Helvetica Neue" as CFString, 18, nil)

     for chr in ["A", "⏭"] {
        print("The result for \(chr) is \(font.isCharSupported(chr))")
    }

}

Выход

The result for A is true
The result for ⏭ is false

, даже если оба символа правильно отображаются устройством.

Обновление. После комментариев rmaddy я создал код для печати всех поддерживаемых кодов символов. Вот поддерживаемые шестнадцатеричные коды, начинающиеся с 2:

2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200A 200B 2011 2012 2013
2014 2016 2018 2019 201A 201C 201D 201E 2020 2021 2022 2023 2026 202F 2030
2032 2033 2034 2038 2039 203A 203D 203F 2041 2042 2043 2044 2053 205F 2060
2070 2071 2074 2075 2076 2077 2078 2079 207A 207B 207C 207D 207E 207F 2080
2081 2082 2083 2084 2085 2086 2087 2088 2089 208A 208B 208C 208D 208E 20A1
20A2 20A3 20A4 20A5 20A6 20A7 20A8 20A9 20AA 20AB 20AC 20AD 20AE 20B1 20B2
20B3 20B4 20B5 20B8 20B9 20BA 20BC 20BD 20BE 20BF 20DD 20DE 2100 2101 2103
2105 2106 2109 2116 2117 2120 2122 2126 212A 212B 2150 2151 2152 2153 2154
2155 2156 2157 2158 2159 215A 215B 215C 215D 215E 2190 2191 2192 2193 2194
2196 2197 2198 2199 2202 2206 2207 220F 2211 2212 2219 221A 221B 221E 222B
223C 2248 2260 2261 2264 2265 2460 2461 2462 2463 2464 2465 2466 2467 2468
24B6 24B7 24B8 24B9 24BA 24BB 24BC 24BD 24BE 24BF 24C0 24C1 24C2 24C3 24C4
24C5 24C6 24C7 24C8 24C9 24CA 24CB 24CC 24CD 24CE 24CF 24EA 24FF 2502 25A0
25A1 25B2 25B4 25B6 25B8 25BC 25BE 25C0 25C2 25CA 25CB 25CF 25E6 2660 2663
2665 2666 266D 266E 266F 26AC 2713 2717 275B 275C 275D 275E 2776 2777 2778
2779 277A 277B 277C 277D 277E 2780 2781 2782 2783 2784 2785 2786 2787 2788
278A 278B 278C 278D 278E 278F 2790 2791 2792 27A4 2934 2935 2936 2937 2981

Как видите, мультимедийные управляющие символы (имеющие код 0x23XX) не отображаются среди поддерживаемых, однако отображаются корректно

...