【问题标题】:Convert emoji to hex value using Swift使用 Swift 将表情符号转换为十六进制值
【发布时间】:2015-02-01 09:04:33
【问题描述】:

我正在尝试将表情符号转换为十六进制值,我发现 some code online 可以做到这一点,但它只适用于 Objective C,如何用 Swift 做同样的事情?

【问题讨论】:

    标签: swift hex emoji


    【解决方案1】:

    这是一个“纯 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 博客的 Strings in 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:0️⃣ 由三个 Unicode 代码点组成:U+0030(字符“0”),然后是 U+FE0F(VARIATION SELECTOR-16)和 U+20E3(组合封装) KEYCAP) – 你认为正确的输出应该是什么?
    • @TomSawyer: ?‍❤️‍?‍? 甚至不是单个字符,它是由字符"?‍", "❤️‍", "?‍", "?" 组成的String
    • @TomSawyer:非常感谢一些反馈它“不起作用”以及正确的输出应该是什么(在您看来)......
    • @MartinR 有什么方法可以获取表情符号的名称,例如 - :smile:, :angry: 等等?
    【解决方案2】:

    如果有人试图找到一种方法将 Emoji 转换为 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()

    结果: ?

    【讨论】:

    • 这个工作正常,但是其他语言的字符有问题:例如:“Ä”——这个字母没有用上面的方式正确编码
    【解决方案3】:

    它的工作原理类似,但打印时要注意:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 2017-03-27
      • 2015-09-27
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多