首页 > 解决方案 > 以编程方式将肤色修饰符添加到表情符号

问题描述

我在我的应用程序中为表情符号添加肤色修饰符时遇到了一些问题。例如,如果我使用:

let text = "" + "" 

它打印

但是,对于其他表情符号,它不起作用。例如:

let text = "‍" + ""

打印 ‍</p>

向表情符号添加肤色修饰符的正确方法是什么?

标签: swiftemoji

解决方案


仅当前面的字符是普通的 Emoji 字符时,添加肤色修饰符才有效。事实证明,你"‍"实际上是由 3 个字符组成的。普通女人表情符号 U+1F469 ( ),然后是 U+200D,最后是头发修饰符 U+1F9B0 ( )。

你可以看到这个:

print(Array("‍".unicodeScalars)) // ["\u{0001F469}", "\u{200D}", "\u{0001F9B0}"]

所以尝试在头发修饰剂之后添加肤色修饰剂是行不通的。肤色修饰符需要紧跟在基本表情符号之后。

这是一个字符串扩展,即使角色已经有肤色或其他修饰符,也会对角色应用肤色。

extension String {
    func applySkinTone(_ tone: String) -> String {
        guard tone.count == 1 && self.count > 0 else { return self }
        let minTone = Unicode.Scalar(0x1F3FB)!
        let maxTone = Unicode.Scalar(0x1F3FF)!
        guard let toneChar = tone.unicodeScalars.first, minTone...maxTone ~= toneChar else { return self }

        var scalars = Array(self.unicodeScalars)
        // Remove any existing tone
        if scalars.count >= 2 && minTone...maxTone ~= scalars[1] {
            scalars.remove(at: 1)
        }
        // Now add the new tone
        scalars.insert(toneChar, at: 1)

        return String(String.UnicodeScalarView(scalars))
    }
}

print("".applySkinTone("")) // 
print("‍".applySkinTone("")) // ‍

请注意,此代码不会对原始字符串是否支持肤色进行任何验证。


推荐阅读