swift - 以编程方式将肤色修饰符添加到表情符号
问题描述
我在我的应用程序中为表情符号添加肤色修饰符时遇到了一些问题。例如,如果我使用:
let text = "" + ""
它打印
但是,对于其他表情符号,它不起作用。例如:
let text = "" + ""
打印 </p>
向表情符号添加肤色修饰符的正确方法是什么?
解决方案
仅当前面的字符是普通的 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("")) //
请注意,此代码不会对原始字符串是否支持肤色进行任何验证。
推荐阅读
- .net - BeautifulSoup 可以在 IronPython 上运行吗?
- github - 如何在 github 项目中添加语言
- amazon - aws kinesis firehose 中的复制命令不起作用
- forms - Django2表单提交post文章时没有发生任何事情
- c# - 使用 firebase 和 web api 2 进行外部登录和应用登录
- r - 正则表达式从文件路径 R 中提取字符串?
- java - 带搜索的严格自动完成 JComboBox
- python - SQLAlchemy:提前在关系列上动态应用过滤器
- dart - 与容器装饰一起使用时,墨水瓶不显示波纹
- angular - Angular 2下拉列表条件元素