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

标签 swift emoji

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

let text = "👍" + "🏻" 

它打印出👍🏻

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

let text = "👩‍🦰" + "🏻"

打印👩‍🦰🏻

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

最佳答案

仅当前面的字符是普通 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("🏾")) // 👩🏾‍🦰

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

关于swift - 以编程方式向表情符号添加肤色修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674968/

相关文章:

swift - 如何在 NSSet Core Data (Swift) 中保存值

ios - Xcode 中单个场景中的多个自定义 View

正则表达式删除所有内容,但从 R 中的字符串中删除表情符号?

java - 如何将 "plaintext"Java 源代码点以编程方式转换为 Python3 中的表情符号?

objective-c - 我们如何使用用户名密码 csrf token 和 csrfmiddlewaretoken 登录到 Web 服务器

swift - "\u{}"的 Unicode 和可接受的参数

Python 3 Selenium |剪贴板不适用于 Windows 上的 headless chromedriver

java - 如何在 JLabel 中获取带有颜色的表情符号

mysql - mysql latin1 是否也支持 emoji 字符?

ios - swift 3 : UITableView row height changes due to UINavigationViewController