2016-06-21 19 views
0

に変換します。サーバーから取得したテキスト文字列にemojisのunicodeスカラーがあります。UILabelでそれらを表示すると、emojisとして表示されません。Swiftのunicodeスカラー絵文字を

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を削除することができます:シンプルな非正規表現のソリューションがあれば、私はこの回答を削除します@ fricom-in-swoft – 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 
}