以编程方式向表情符号添加肤色修饰符

4
我在我的应用程序中添加一个肤色调整器到表情符号时遇到了一些问题。例如,如果我使用:
let text = "" + "" 

它可以打印出基本的表情符号。

但是,对于其他表情符号,它无法正常工作。例如:

let text = "‍" + ""

打印 ‍

如何正确地为表情符号添加肤色修改器?


从此网站复制表情符号:https://emojipedia.org/apple/ - Muhammad Maaz Ul Haq
而且,如果表情符號已經被著色,它會像這樣顯示。 - Muhammad Maaz Ul Haq
皮肤色调表情符号教程:https://crunchybagel.com/using-emoji-skin-tone-modifiers-in-swift/ - Muhammad Maaz Ul Haq
1个回答

11

只有前一个字符是普通的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("")) // ‍

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

这个答案适用于设置个人肤色,但对于一些夫妇并不适用。有什么办法可以让它适用于夫妇吗? - Kurt L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接