如何在Swift中的数组中获取所有可用的表情符号?

kan*_*iya 1 arrays ios swift

我希望能够在Swift中获得所有可用emojis的数组.我所说的是所有当前可以访问设备的.就像Apple添加了一些新的表情符号一样,我希望不必更改任何代码,而新的表情符号只是添加到数组中与其他所有表情符号一起添加.

如果无法获得更新的表情符号,那么如何将所有当前表情符号放入一个数组(或者可能是一个.plist文件,然后我可以加载到一个数组中),这样我就可以在代码中访问它们了?

小智 7

这个SO似乎提供了答案 如何在不使用任何形式的查找表的情况下在iOS 8中列出(几乎)所有表情符号?

for i in 0x1F601...0x1F64F {  
    let c = String(UnicodeScalar(i) ?? "-")  
    print(c)  
}  
Run Code Online (Sandbox Code Playgroud)

你应该超越1F64F, 找出字符串中的字符是否是表情符号?

        0x1F600...0x1F64F, // Emoticons
        8400...8447: // Combining Diacritical Marks for Symbols
        9100...9300, // Misc items
        0x2600...0x26FF,   // Misc symbols
        0x2700...0x27BF,   // Dingbats
        0xFE00...0xFE0F,   // Variation Selectors
        0x1F018...0x1F270, // Various asian characters
        0x1F300...0x1F5FF, // Misc Symbols and Pictographs
        0x1F680...0x1F6FF, // Transport and Map
        0x1F1E6...0x1F1FF, // Regional country flags
        0x1F900...0x1F9FF,  // Supplemental Symbols and Pictographs
        65024...65039, // Variation selector
Run Code Online (Sandbox Code Playgroud)

但是,你得到一些未定义的(在范围的末尾标记为?)请参阅此处跳过它们 有没有办法知道iOS中是否支持表情符号?

请注意,在搜索时,根据国家/地区代码www.timekl.com/blog/2017/08/31/swift-tricks-emoji-flags/找到了生成表情符号标记的有趣链接

最终得到以下代码

func isEmoji(_ value: Int) -> Bool {  
    switch value {  
    case 0x1F600...0x1F64F, // Emoticons  
    0x1F300...0x1F5FF, // Misc Symbols and Pictographs  
    0x1F680...0x1F6FF, // Transport and Map  
    0x1F1E6...0x1F1FF, // Regional country flags  
    0x2600...0x26FF,   // Misc symbols 9728 - 9983  
    0x2700...0x27BF,   // Dingbats  
    0xFE00...0xFE0F,   // Variation Selectors  
    0x1F900...0x1F9FF,  // Supplemental Symbols and Pictographs 129280 - 129535  
    0x1F018...0x1F270, // Various asian characters           127000...127600  
    65024...65039, // Variation selector  
    9100...9300, // Misc items  
    8400...8447: // Combining Diacritical Marks for Symbols  
        return true  

    default: return false  
    }  
}  




extension Character {  
    private static let refUnicodeSize: CGFloat = 8  
    private static let refUnicodePng =  
        Character("\u{1fff}").png(ofSize: Character.refUnicodeSize)  

func png(ofSize fontSize: CGFloat) -> Data? {  
    let attributes = [NSAttributedString.Key.font:  
        UIFont.systemFont(ofSize: fontSize)]  
    let charStr = "\(self)" as NSString  
    let size = charStr.size(withAttributes: attributes)  

    UIGraphicsBeginImageContext(size)  
    charStr.draw(at: CGPoint(x: 0,y :0), withAttributes: attributes)  

    var png:Data? = nil  
    if let charImage = UIGraphicsGetImageFromCurrentImageContext() {  
        png = charImage.pngData()  
    }  

    UIGraphicsEndImageContext()  
    return png  
}  

func unicodeAvailable() -> Bool {  
    if let refUnicodePng = Character.refUnicodePng,  
        let myPng = self.png(ofSize: Character.refUnicodeSize) {  
        return refUnicodePng != myPng  
    }  
    return false  
}  
}  

for i in 8400...0x1F9FF where isEmoji(i) {  
    if let scalar = UnicodeScalar(i) {  
        let unicode = Character(scalar)  
        if unicode.unicodeAvailable() {  
            print(i, String(scalar))  
            count += 1  
        } else {  
            notAvail += 1  
            print(i)  
        }  
    } else {  
        notCounted += 1  
    }  
}  

print("Count", count, "Not counted", notCounted, "Not Avail", notAvail) 
Run Code Online (Sandbox Code Playgroud)