【问题标题】:Convert unicode scalar emoji to String in Swift在 Swift 中将 unicode 标量表情符号转换为字符串
【发布时间】:2016-10-22 16:06:45
【问题描述】:

我在从服务器获取的文本字符串中获取 emoji 的 unicode 标量,当我在 UILabel 中打印它们时无法显示为 emoji。这是我从服务器获取字符串的格式:

let string = "Hi, I'm lily U+1F609"

这不起作用,除非它被更改为

let string = "Hi, I'm lily \u{1F609}"

无论如何我可以将字符串转换为所需的格式吗?

我不想使用正则表达式来确定U+<HEX_CODE> 的出现,然后将它们转换为\u{HEX_CODE}。必须有更好的方法来做到这一点。

【问题讨论】:

  • 您可以先删除U+ 部分,然后使用stackoverflow.com/questions/32555145/…
  • @EricD 我得到的字符串不会总是一样的。如果我删除 U+ 部分,剩下的字符串将是"Hi, I'm lily F609"。我怎么知道 F609 是代表一个 unicode 标量还是只是带有文本 F609 的字符串
  • 您知道它是因为您刚刚删除了它之前的U+。 :) 其他类似的要保存的文本 不会有这个前缀。无论如何,这只是一个想法 - 当然,实施可能需要一些调整。

标签: ios xcode swift unicode emoji


【解决方案1】:

这正是创建正则表达式的问题。如果有更简单的非正则表达式解决方案,我将删除此答案:

func replaceWithEmoji(str: String) -> String {
    var result = str

    let regex = try! NSRegularExpression(pattern: "(U\\+([0-9A-F]+))", options: [.CaseInsensitive])
    let matches = regex.matchesInString(result, options: [], range: NSMakeRange(0, result.characters.count))

    for m in matches.reverse() {
        let range1 = m.rangeAtIndex(1)
        let range2 = m.rangeAtIndex(2)

        if let codePoint = Int(result[range2], radix: 16) {
            let emoji = String(UnicodeScalar(codePoint))
            let startIndex = result.startIndex.advancedBy(range1.location)
            let endIndex = startIndex.advancedBy(range1.length)

            result.replaceRange(startIndex..<endIndex, with: emoji)
        }
    }

    return result
}

【讨论】:

    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 2018-11-16
    • 2018-08-28
    • 1970-01-01
    • 2016-04-08
    • 2015-10-18
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多