在Swift中如何将所有可用的表情符号放入一个数组中?

3
我希望能够在Swift中获取所有可用表情符号的数组。我所说的可用是指当前设备可以访问到的所有表情符号。例如,当苹果添加一些新的表情符号时,我不想改变任何代码,而是希望新的表情符号自动添加到数组中与其他表情符号一起。
如果无法获取更新的表情符号,则如何将所有当前表情符号放入一个数组(或者可能是一个.plist文件,然后加载到数组中),以便我可以在代码中访问它们?
1个回答

13

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

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

您需要超越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

然而,你可能会得到一些未定义的内容(在范围末尾标记为?)。 点击此处可以跳过这些内容。

请注意,在搜索时,找到了以下有趣的链接,可以根据国家代码生成表情旗帜: 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) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接