【问题标题】:How to know if two emojis will be displayed as one emoji?如何知道两个表情符号是否会显示为一个表情符号?
【发布时间】:2016-12-30 10:59:43
【问题描述】:

表情符号??????????由 2 个 unicodeScalars 组成???? U+1F44D, ???? U+1F3FC。

如何将其识别为 1 个“已显示”表情符号,因为它将在 iOS 上显示为这样?

【问题讨论】:

标签: ios swift string unicode emoji


【解决方案1】:

Swift 4 (Xcode 9) 更新

从 Swift 4 开始,“表情符号序列”被视为单个字素 集群(根据 Unicode 9 标准):

let s = "a??b?‍❤️‍?‍?"
print(s.count) // 4

因此不再需要其他解决方法。


(Swift 3 及更早版本的旧答案:)

一个可能的选择是枚举和计数 字符串中的“组合字符序列”:

let s = "a??b?‍❤️‍?‍?"
var count = 0
s.enumerateSubstringsInRange(s.startIndex..<s.endIndex,
                             options: .ByComposedCharacterSequences) {
                                (char, _, _, _) in
                                if let char = char {
                                    count += 1
                                }
}
print(count) // 4

另一种选择是查找组合字符的范围 给定索引处的序列:

let s = "?‍❤️‍?‍?"
if s.rangeOfComposedCharacterSequenceAtIndex(s.startIndex) == s.characters.indices {
    print("This is a single composed character")
}

作为String扩展方法:

// Swift 2.2:
extension String {
    var composedCharacterCount: Int {
        var count = 0
        enumerateSubstringsInRange(characters.indices, options: .ByComposedCharacterSequences) {
            (_, _, _, _) in count += 1
        }
        return count
    }

    var isSingleComposedCharacter: Bool {
        return rangeOfComposedCharacterSequenceAtIndex(startIndex) == characters.indices
    }
}

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

    var isSingleComposedCharacter: Bool {
        return rangeOfComposedCharacterSequence(at: startIndex) == startIndex..<endIndex
    }
}

例子:

"??".composedCharacterCount // 1
"??".characters.count       // 2

"?‍❤️‍?‍?".composedCharacterCount // 1
"?‍❤️‍?‍?".characters.count       // 4

"????".composedCharacterCount // 2
"????".characters.count       // 1

如您所见,Swift 字符(扩展的字形簇)的数量可以多于或少于 组合字符序列的数量。

【讨论】:

  • 这太棒了??这对?‍❤️‍?有什么作用?它有 6 个 unicodeScalar,3 个字符,rangeOfComposedCharacterSequenceAtIndex(startIndex) 为 0..
  • @Manuel:它也适用于标志(参见添加的示例),我觉得更令人惊讶。
  • 不应该 "????".characters.count 是 4 而不是 1?
  • @Manuel:“区域指标”是一个奇怪的东西,比较stackoverflow.com/questions/26862282/…。任何区域指示符 (RI) 字符序列都被视为单个字素簇。
  • @Manuel: print(Array("?‍❤️‍?".unicodeScalars)) 可能很有启发性。有 3 个 Swift 字符,但有 6 个 Unicode 标量(包括 U+200D ZERO-WIDTH JOINER)。 Unicode 标量 > U+FFFF 占用两个索引位置(它们在内部存储为 UTF-16 代理对)。 – Unicode 很有趣!
猜你喜欢
  • 2019-05-11
  • 2016-01-12
  • 1970-01-01
  • 2021-10-11
  • 2014-03-27
  • 2014-05-17
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多