【问题标题】:Emoji skin-tone detect表情符号肤色检测
【发布时间】:2019-12-26 18:38:40
【问题描述】:

post 之后,我尝试将代码从 Swift 2.0 更新到 Swift 5.0,以检查哪些表情符号有可用的肤色以及其他已经存在的变体。 我的更新代码详细:

extension String {
var emojiSkinToneModifiers: [String] {
    return [ "????", "????", "????", "????", "????" ]
}

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

var emojiUnmodified: String {
    if self.count == 0 {
        return ""
    }
    let range = String(self[..<self.index(self.startIndex, offsetBy: 1)])
    return range
}

var canHaveSkinToneModifier: Bool {
    if self.count == 0 {
        return false
    }
    let modified = self.emojiUnmodified + self.emojiSkinToneModifiers[0]
    return modified.emojiVisibleLength == 1
}
}

并将其与数组一起使用:

let emojis = [ "????", "????????", "????" ]
for emoji in emojis {
   if emoji.canHaveSkinToneModifier {
        let unmodified = emoji.emojiUnmodified
        print(emoji)
        for modifier in emoji.emojiSkinToneModifiers {
            print(unmodified + modifier)
        }
    } else {
      print(emoji)
    }
 }

输出: ????????????????????????????????????????????? ??????????????????????????????????????????????????? ?????????????????? ????????????????????????????????????????????? 将变体分配给没有它们或已经存在的表情符号,而不是:?????????????????????????????????? ?????? ?????? ????

我想enumerateSubstringsInRange 是不正确的,self.characters.count 现在变成了self.count,与before Swift 4 相比,计数一个表情符号(合成)很容易且正确,但在这种情况下可能没有用。我没看错什么? 谢谢

【问题讨论】:

  • 我目前没有答案,但请注意,从 Swift 4 开始,扩展字形簇算作单个字符,因此 s.emojiVisibleLength 的结果与 s.count 相同(比较stackoverflow.com/q/39104152/1187415)。
  • 糟糕,我的意思是 Emoji 序列 在 Swift 4(及更高版本)中被视为单个字符。
  • @MartinR 我也曾假设...欢迎提供解决方案????

标签: ios swift emoji


【解决方案1】:

“hack”是比较 正确 表情符号(如“?”)和 想要成为表情符号(如“??” )。

我已经在这里和那里修改了您的代码以使其正常工作:

extension String {
    static let emojiSkinToneModifiers: [String] =  ["?", "?", "?", "?", "?"]

    var emojiVisibleLength: Int {
        var count = 0
        let nsstr = self as NSString
        let range = NSRange(location: 0, length: nsstr.length)
        nsstr.enumerateSubstrings(in: range,
                            options: .byComposedCharacterSequences)
        { (_, _, _, _) in

            count = count + 1
        }
        return count
    }

    var emojiUnmodified: String {
        if isEmpty {
            return self
        }
        let string = String(self.unicodeScalars.first!)
        return string
    }

    private static let emojiReferenceSize: CGSize = {
        let size = CGSize(width : CGFloat.greatestFiniteMagnitude,
                          height: CGFloat.greatestFiniteMagnitude)
        let rect = ("?" as NSString).boundingRect(with: size,
                                                     options: .usesLineFragmentOrigin,
                                                     context: nil)
        return rect.size
    }()

    var canHaveSkinToneModifier: Bool {
        if isEmpty {
            return false
        }

        let modified = self.emojiUnmodified + String.emojiSkinToneModifiers[0]

        let size = (modified as NSString)
            .boundingRect(with: CGSize(width : CGFloat.greatestFiniteMagnitude,
                                       height: .greatestFiniteMagnitude),
                          options: .usesLineFragmentOrigin,
                          context: nil).size

        return size == String.emojiReferenceSize
    }
}

让我们试试吧:

let emojis = [ "?", "??", "?" ]
for emoji in emojis {
    if emoji.canHaveSkinToneModifier {
        let unmodified = emoji.emojiUnmodified
        print(unmodified)
        for modifier in String.emojiSkinToneModifiers {
            print(unmodified + modifier)
        }
    } else {
        print(emoji)
    }
    print("\n")
}

瞧!

?
??
??
??
??
??
?
??
??
??
??
??
?

【讨论】:

  • 谢谢,这可能是 ? 和 ? 的一个想法,但是将肤色修饰符应用于已经修改过的表情符号(如 ??)没有多大意义。所以对于像???????????,??,?这样的非输出?请检查我在问题中的第一个链接
  • 从 swift 4 开始,计数为“全局”。一个解决方案将是一个“真实”计数的破解,比如高达 swift 3。
  • @Joannes 在链接中,在文章底部,肤色应用于??:??: ??????????。那么,您是否想将肤色应用于可能具有皮肤修饰符但现在没有的表情符号?比如??...?
  • 谢谢,今天这是一个解决方案
猜你喜欢
  • 2011-05-24
  • 2016-05-25
  • 2023-03-10
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
相关资源
最近更新 更多