使用Swift将表情符号转换为十六进制值

3

我正在尝试将十六进制的表情符号转换成文本,我找到了一些在线代码可以实现此功能,但只能在Objective C中运行,如何使用Swift实现相同的功能?

3个回答

11

这是一个“纯Swift”方法,不使用Foundation库:

let smiley = ""

let uni = smiley.unicodeScalars // Unicode scalar values of the string
let unicode = uni[uni.startIndex].value // First element as an UInt32

print(String(unicode, radix: 16, uppercase: true))
// Output: 1F60A

请注意,Swift中的Character表示一个“Unicode字形群集”(与Swift博客中的Swift 2中的字符串进行比较),它可以由多个“Unicode标量值”组成。以@TomSawyer评论下面的示例为例:

let zero = "0️⃣"

let uni = zero.unicodeScalars // Unicode scalar values of the string
let unicodes = uni.map { $0.value }

print(unicodes.map { String($0, radix: 16, uppercase: true) } )
// Output: ["30", "FE0F", "20E3"]

不支持与组合表情符号一起使用,例如0️⃣,‍❤️‍‍。 - TomSawyer
@TomSawyer:0️⃣ 由三个 Unicode 代码点组成:U+0030(字符“0”),后跟 U+FE0F(VARIATION SELECTOR-16)和 U+20E3(COMBINING ENCLOSING KEYCAP)- 您认为正确的输出应该是什么? - Martin R
1
@TomSawyer:‍❤️‍‍甚至不是一个单独的字符,它是由字符"‍", "❤️‍", "‍", ""组成的字符串 - Martin R
@TomSawyer:如果您能提供一些反馈,说明它为什么“不起作用”,以及正确的输出应该是什么(在您的意见中),那将不胜感激... - Martin R
@MartinR 有没有什么方法可以获取表情符号的名称,例如::smile:、:angry: 等等? - iDeveloper
显示剩余3条评论

6
如果有人试图找到一种将表情符号转换为Unicode字符串的方法。
extension String {

  func decode() -> String {
      let data = self.data(using: .utf8)!
      return String(data: data, encoding: .nonLossyASCII) ?? self
  }

  func encode() -> String {
      let data = self.data(using: .nonLossyASCII, allowLossyConversion: true)!
      return String(data: data, encoding: .utf8)!
  }
}

示例:

  1. "".encode()

结果: \ud83d\ude0d

  1. "\ud83d\ude0d".decode()

结果:


这个工作正常,但是在其他语言中存在字符问题:例如:"Ä" -- 这个字母无法以上述方式正确编码。 - Suhas Arvind Patil

1
它的工作方式类似,但在打印时要注意:
import Foundation

var smiley = ""
var data: NSData = smiley.dataUsingEncoding(NSUTF32LittleEndianStringEncoding, allowLossyConversion: false)!
var unicode:UInt32 = UInt32()
data.getBytes(&unicode)
// println(unicode) // Prints the decimal value
println(NSString(format:"%2X", unicode)) // Print the hex value of the smiley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接