2016-06-21 27 views
0

我從服務器獲取的文本字符串中的emojis標量爲uno標量,當我在UILabel中打印它們時未能顯示爲emojis。這是我得到我的字符串從服務器格式:將unicode標量表情符號轉換爲Swift中的字符串

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

,除非它改爲

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

這不起作用,反正是有,我可以將字符串轉換爲所需要的格式?

我不想用正則表達式來確定出現U+<HEX_CODE>然後將它們轉換爲\u{HEX_CODE}。必須有更好的方式來做到這一點。

+0

你可以先刪除'U +'部分則使用http://stackoverflow.com/questions/32555145/convert-unicode-eg -1f564-to-emoji-in-swift – Moritz

+0

@EricD我得到的字符串不會總是一樣的。如果我刪除了U +部分,剩下的字符串就會是「嗨,我是莉莉F609」。我如何知道'F609'是否代表一個unicode標量或者只是帶有文本'F609'的字符串 –

+0

你知道嗎,因爲你剛纔刪除了'U +'。 :)其他類似的*文本保存*不會有這個前綴。無論如何,這只是一個想法 - 當然,實施可能需要一些調整。 – Moritz

回答

0

這是正則表達式創建的那種問題。如果有一個更簡單的非正則表達式的解決方案,我會刪除這個答案:

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 
} 
相關問題