字符串中的表情符号数量?

时间:2015-11-11 00:00:30

标签: ios string swift nsstring emoji

最近添加了iOS 9.1表情符号,以及肤色的可用性等,如何正确计算字符串中Emojis的数量,假设该字符串是由表情符号唯一制作的?

请记住,表情符号的长度可能会有所不同。

NSString.length或string.characters.count

""返回2
"✊"返回4
""或""或""返回1!
""返回4(通常应显示为1个家庭表情符号)
等...

6 个答案:

答案 0 :(得分:4)

我对String进行了扩展,以计算字符串中表情符号的数量:

extension String {
    func countEmojiCharacter() -> Int {

        func isEmoji(s:NSString) -> Bool {

            let high:Int = Int(s.characterAtIndex(0))
            if 0xD800 <= high && high <= 0xDBFF {
                let low:Int = Int(s.characterAtIndex(1))
                let codepoint: Int = ((high - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000
                return (0x1D000 <= codepoint && codepoint <= 0x1F9FF)
            }
            else {
                return (0x2100 <= high && high <= 0x27BF)
            }
        }

        let nsString = self as NSString
        var length = 0

        nsString.enumerateSubstringsInRange(NSMakeRange(0, nsString.length), options: NSStringEnumerationOptions.ByComposedCharacterSequences) { (subString, substringRange, enclosingRange, stop) -> Void in

            if isEmoji(subString!) {
                length++
            }
        }

        return length
    }
}

测试:

let y = "xxxzzz"

print(y.countEmojiCharacter())
// result is 3

答案 1 :(得分:2)

试试此代码段

extension String {
    var composedCount : Int {
        var count = 0
        enumerateSubstringsInRange(startIndex..<endIndex, options: .ByComposedCharacterSequences) {_ in count++}
        return count
    }
}

:赠送到ericasadun

答案 2 :(得分:1)

您可以使用此代码example或此pod

要在Swift中使用它,请将类别导入YourProject_Bridging_Header

#import "NSString+EMOEmoji.h"

然后你可以检查字符串中每个表情符号的范围:

let example: NSString = "string‍‍‍withemojis✊" //string with emojis

let emojiCount: NSInteger = example.emo_emojiCount()  // count

print(emojiCount)

// Output: ["3"]

I created an small example project with the code above.

<强>更新

使用&gt; = iOS 8.3运行此代码将具有

// Output: ["3"]

使用&lt;运行此代码iOS 8.3将有一个

// Output: ["7"]

这是因为iOS 8.3引入了家庭表情符号,肤色等等。因此,较小的iOS版本以不同的方式阅读这个表情符号。

例如,在Safari,Firefox和Chrome中打开此帖以查看差异。

答案 3 :(得分:0)

swift4答案:

extension String {
    var composedCount : Int {
        var count = 0
        enumerateSubstrings(in: startIndex..<endIndex, options: .byComposedCharacterSequences) { (_, _, _, _) in
            count = count + 1
        }

        return count
    }
}

答案 4 :(得分:0)

表情符号很像unicode标准,看似复杂。肤色,性别,工作,人群,零宽度连接符序列,标志(2个字符的unicode)和其他复杂性会使表情符号解析变得混乱。一棵圣诞树,一片披萨或一堆便便都可以用一个Unicode代码点表示。更不用说引入新表情符号时,iOS支持和表情符号发布之间会有延迟。事实是,不同版本的iOS支持不同版本的unicode标准。

TL; DR。我已经研究了这些功能,并开放了一个我JKEmoji的作者的库,以帮助解析带有表情符号的字符串。它使解析变得简单:

print("I love these emojis ‍‍‍".emojiCount)
  

5

通过常规刷新最新的unicode版本(最近为12.0)的所有已识别表情符号的本地数据库,并将它们与正在运行的OS版本中被识别为有效表情符号的内容进行交叉引用通过查看无法识别的表情符号字符的位图表示形式。

注意

删除了先前的答案,原因是我没有在广告中明确指出我是作者,而是在宣传我的图书馆。我再次确认这一点。

答案 5 :(得分:0)

试试这个代码(实际适用于 Swift 5):

extension Character {
    var isSimpleEmoji: Bool {
        guard let firstScalar = unicodeScalars.first else { return false }
        return firstScalar.properties.isEmoji && firstScalar.value > 0x238C
    }

    var isEmoji: Bool {
        return isSimpleEmoji
    }
}

extension String {
    var emojis: [Character] { filter { $0.isEmoji } }
}

使用:

let emojisCount = yourString.emojis.count