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

时间:2016-03-25 08:35:04

标签: ios unicode swift2 emoji

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

{
    "unicode":"1f468-1f468-1f467-1f467"
}

我应该把它翻译成复合字符,用于显示和/或复制到粘贴板:

到目前为止,解决方案来自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

对于单字符表情符号定义,很好

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

{
    "unicode":"1f4a9"
}

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

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

1 个答案:

答案 0 :(得分:3)

在你的操场上尝试这个,看看差异......

"".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}
 */

原始的,稍加修改的代码

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) // ‍‍‍

纯粹的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) // ‍‍‍