如何从原始十六进制组成多字符表情符号

clo*_*ach 3 unicode ios emoji swift2

我从服务器得到这样的 JSON:

{
    "unicode":"1f468-1f468-1f467-1f467"
}
Run Code Online (Sandbox Code Playgroud)

我应该将其转换为复合字符以显示和/或复制到粘贴板:???

到目前为止的解决方案来自这个SO question

let u = json["unicode"] as? String
let dashless = u.characters.split{$0 == "-"}.map(String.init)
let charArray = dashless.map { char -> Character in
    let code = Int(strtoul(char, nil, 16))
    return Character(UnicodeScalar(code))
}
let unicode = String(charArray)
UIPasteboard.generalPasteboard().string = unicode
Run Code Online (Sandbox Code Playgroud)

这对于单字符表情符号定义非常有用。

例如,我可以使用这个 JSON 运行上面的代码......

{
    "unicode":"1f4a9"
}
Run Code Online (Sandbox Code Playgroud)

...并粘贴预期的结果:。但是当我使用mmgg前面列出的家庭表情符号时,我在 iOS 中得到以下内容,减去空格:?? ? . 当粘贴到文本字段时,他们似乎不想合并。

这是iOS错误,还是我做错了什么?

use*_*734 5

在你的操场上试试这个,看看有什么不同......

"".unicodeScalars.forEach { (c) in
    print(c.escape(asASCII: true),terminator: "")
}

print("")

"???".unicodeScalars.forEach { (c) in
    print(c.escape(asASCII: true), terminator: "")
}

/*
 \u{0001F468}\u{0001F468}\u{0001F467}\u{0001F467}
 \u{0001F468}\u{200D}\u{0001F468}\u{200D}\u{0001F467}\u{200D}\u{0001F467}
 */
Run Code Online (Sandbox Code Playgroud)

你原来的,稍微修改过的代码

import Darwin // stroul

let u = "1f468-1f468-1f467-1f467"
let dashless = u.characters.split{$0 == "-"}.map(String.init)
let emoji = dashless.map { char -> String in
    let code = Int(strtoul(char, nil, 16))
    return String(UnicodeScalar(code))
    }.joinWithSeparator("\u{200D}")

print(emoji) // ???
Run Code Online (Sandbox Code Playgroud)

纯 Swift 代码,无基础,无 strtoul

let u = "1f468-1f468-1f467-1f467"
let emoji = u.characters.split("-")
    .map {String(UnicodeScalar(Int(String($0),radix: 16) ?? 0))}
    .joinWithSeparator("\u{200D}")

print(emoji) // ???
Run Code Online (Sandbox Code Playgroud)

  • 啊,厉害!不知道 [zero-width joiner](https://en.wikipedia.org/wiki/Zero-width_joiner)。 (2认同)