【问题标题】:Number of emojis in a String?字符串中的表情符号数量?
【发布时间】:2015-11-11 00:00:30
【问题描述】:

随着最近添加的 iOS 9.1 表情符号以及肤色等的可用性,假设字符串是由 emojis 组成的,您如何正确计算字符串中 Emojis 的数量?

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

NSString.length 或 string.characters.count

“???”返回 2
“✊????”返回 4
“??????”或者 ”????????”或者 ”???????????????????????????????????????????????? "返回 1!
“??????‍????‍??????‍??????”返回 4(通常应显示为 1 个家庭表情符号)
等等……

【问题讨论】:

  • 只使用字符串长度方法 - 它返回字符串中的字符数,而不是字节数,因此可以满足多字节字符,例如表情符号
  • @Paulw11 字符串长度对于常规表情符号返回 2,对于肤色表情符号返回 4。更奇怪的是它为一串 n 标志返回 1。
  • 嗯。此处描述了标志问题 - oleb.net/blog/2014/07/swift-strings 基本上,字素簇的组合似乎还不是很“正确”,也许是因为其中一些的 Unicode 规范仍然是草稿。例如????”在一个字符串中分解为 ??????‍ ????‍ ????‍ ????如果您访问字符串的characters 属性
  • 希望我的回答能帮到你。

标签: ios string swift nsstring emoji


【解决方案1】:

我扩展了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 = "xxx?????zzz"

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

【讨论】:

【解决方案2】:

试试这个代码sn-p

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

:感谢 ericasadun

【讨论】:

    【解决方案3】:

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

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

    #import "NSString+EMOEmoji.h"
    

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

    let example: NSString = "string?‍?‍?‍?with?emojis✊?" //string with emojis
    
    let emojiCount: NSInteger = example.emo_emojiCount()  // count
    
    print(emojiCount)
    
    // Output: ["3"]
    

    I created an small example project with the code above.

    更新

    使用 >= iOS 8.3 运行此代码将有一个

    // Output: ["3"]
    

    // Output: ["7"]
    

    这是因为 iOS 8.3 引入了家庭表情符号、肤色和许多其他内容。因此,较小的 iOS 版本正在以不同的方式阅读此表情符号。

    例如,在 Safari、Firefox 和 Chrome 中打开这篇文章,看看有什么区别。

    【讨论】:

      【解决方案4】:

      swift4 回答:

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

      【讨论】:

        【解决方案5】:

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

        TL;DR. 我致力于这些功能并开源了一个库,我是JKEmoji 的作者,以帮助解析带有表情符号的字符串。它使解析变得如此简单:

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

        5

        它通过从最新的 unicode 版本(最近的12.0)定期刷新所有已识别表情符号的本地数据库并通过查看将它们与正在运行的操作系统版本中被识别为有效表情符号的内容进行交叉引用来实现这一点在无法识别的表情符号字符的位图表示中。

        注意

        之前的答案因宣传我的图书馆而被删除,但没有明确说明我是作者。我再次承认这一点。

        【讨论】:

          【解决方案6】:

          试试这段代码(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
          

          【讨论】:

            【解决方案7】:

            某些情况(例如网络):

            "?‍?‍?‍?".utf8.count
            

            【讨论】:

              猜你喜欢
              • 2021-11-07
              • 2017-12-27
              • 1970-01-01
              • 2014-04-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-27
              • 1970-01-01
              相关资源
              最近更新 更多