顽固的表情符号不会组合:‍❤‍‍

Stubborn emoji won't combine: ‍❤‍‍

即使在 @user3441734 之后,从 [String:String] 转换为 String 时,仍有一些表情符号似乎无法正确呈现。

这里有一些可用于 Playground 的代码来说明问题:

var u = ""
u = "1f468-1f468-1f467-1f467" // ‍‍‍
//u = "1f918-1f3ff" // 
//u = "1f468-2764-1f48b-1f468" // ‍❤‍‍ (broken)
//u = "1f3c7-1f3fb" // ‍ (broken)

let unicodeArray = u.characters.split("-")
    .map(String.init)
    .map {String(UnicodeScalar(Int([=10=],radix: 16) ?? 0))}

if let last = unicodeArray.last {
    let separator: String
    switch (unicodeArray.first, last) {
        // Failed attempt to get tone applied to jockey
    case let (horse_racing, _) where horse_racing == "\u{1f3c7}":
        separator = "\u{200d}"
    case let (_, tone) where "\u{1f3fb}"..."\u{1f3ff}" ~= tone:
        separator = ""
    case let (_, regionalIndicatorSymbol) where "\u{1f1e6}"..."\u{1f1ff}" ~= regionalIndicatorSymbol:
        separator = ""
    default:
        separator = "\u{200d}"
    }
    print(unicodeArray.joinWithSeparator(separator))
}

依次取消对 u 的每个作业的注释,以查看实际问题。第三个和第四个值应该像这样呈现:

想法…

所以,Apple 和 Chrome 对某些表情符号的处理存在错误,还是我错过了标准的另一种特质?

没有阴谋,错误在你的代码中。

  • 第一个字符可以用:

    U+1F468 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468

    注意每个字符之间的零宽度连接器 (U+200D),以及 HEAVY BLACK HEART (U+2764) 上的 VARIATION SELECTOR-16 选择器 (U+FE0F) 以确保使用表情符号呈现方式。

    参考this table获取已实现的多人分组的完整列表。

  • U+1F3C7赛马不是表情符号修改器基础,因此不支持肤色修改器。