I am having some issues adding a skin tone modifier to an emoji in my app. For example, if I use:
let text = "" + ""
Run Code Online (Sandbox Code Playgroud)
It prints
However, for other emojis it does not work. For example:
let text = "?" + ""
Run Code Online (Sandbox Code Playgroud)
Prints ?
What is the proper way to add a skin tone modifier to an emoji?
仅当前面的字符是普通的表情符号字符时,添加肤色修饰符才有效。事实证明,您"?"实际上由 3 个字符组成。素颜女表情U+1F469 ( ),接着是U+200D,最后是头发修饰符U+1F9B0 ( )。
你可以看到这个:
print(Array("?".unicodeScalars)) // ["\u{0001F469}", "\u{200D}", "\u{0001F9B0}"]
Run Code Online (Sandbox Code Playgroud)
所以尝试在头发修改器后添加肤色修改器不起作用。肤色修饰符需要紧跟在基本表情符号之后。
这是一个字符串扩展,即使角色已经有肤色或其他修饰符,它也会对角色应用肤色。
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("")) // ?
Run Code Online (Sandbox Code Playgroud)
请注意,此代码不会对原始字符串支持肤色进行任何验证。
| 归档时间: |
|
| 查看次数: |
358 次 |
| 最近记录: |