如何从原始十六进制组成多字符表情符号
How to compose multi-character emoji from raw hex
我从服务器得到这样的JSON:
{
"unicode":"1f468-1f468-1f467-1f467"
}
我要把它翻译成复合字符显示and/or复制到粘贴板:
目前的解决方案来自这个:
let u = json["unicode"] as? String
let dashless = u.characters.split{[=11=] == "-"}.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 错误,还是我做错了什么?
在你的操场上试试这个,看看有什么不同...
"".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{[=11=] == "-"}.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([=12=]),radix: 16) ?? 0))}
.joinWithSeparator("\u{200D}")
print(emoji) //
我从服务器得到这样的JSON:
{
"unicode":"1f468-1f468-1f467-1f467"
}
我要把它翻译成复合字符显示and/or复制到粘贴板:
目前的解决方案来自这个
let u = json["unicode"] as? String
let dashless = u.characters.split{[=11=] == "-"}.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 错误,还是我做错了什么?
在你的操场上试试这个,看看有什么不同...
"".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{[=11=] == "-"}.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([=12=]),radix: 16) ?? 0))}
.joinWithSeparator("\u{200D}")
print(emoji) //