2016-06-11 4 views
4

Ich bin auf der Suche nach einer Möglichkeit, Emoji-Zeichen mit ihrer Beschreibung in einer Swift-Zeichenfolge zu ersetzen.So ersetzen Sie Emoji-Zeichen mit ihren Beschreibungen in einer Swift-Zeichenfolge

Beispiel:

Eingang "This is my string "

ich die kennen ersetzen möchten: "This is my string {SMILING FACE WITH OPEN MOUTH AND SMILING EYES}" Ich verwende

Bisher

Ausgang Dieser Code wurde von der o modifiziert riginal Code von this answer by MartinR, aber es funktioniert nur, wenn ich mit einem einzelnen Zeichen zu tun habe.

let myCharacter : Character = "" 
let cfstr = NSMutableString(string: String(myCharacter)) as CFMutableString 
var range = CFRangeMake(0, CFStringGetLength(cfstr)) 
CFStringTransform(cfstr, &range, kCFStringTransformToUnicodeName, Bool(0)) 
var newStr = "\(cfstr)" 

// removing "\N" from the result: \N{SMILING FACE WITH OPEN MOUTH AND SMILING EYES} 
newStr = newStr.stringByReplacingOccurrencesOfString("\\N", withString:"") 

print("\(newStr)") // {SMILING FACE WITH OPEN MOUTH AND SMILING EYES} 

Wie kann ich das erreichen?

+2

Sie sollten im Allgemeinen beachten, dass Sie den ursprünglichen Code von [dieser Antwort von MartinR] erhalten haben (http://stackoverflow.com/a/24701154/2442804) – luk2302

+0

Fertig, danke für den Kommentar luk2302. – Cue

Antwort

7

einfach keine Character an erster Stelle verwenden, aber ein String als Eingabe verwenden:

let cfstr = NSMutableString(string: "This is my string ") as CFMutableString 

das wird schließlich ausgegeben

Dieses {LÄCHELNDES GESICHT mit offenem Mund und lachenden Augen} ist meine Zeichenfolge {LÄCHELNDES GESICHT mit offenem Mund und lachenden Augen}

zusammen:

func transformUnicode(input : String) -> String { 
    let cfstr = NSMutableString(string: input) as CFMutableString 
    var range = CFRangeMake(0, CFStringGetLength(cfstr)) 
    CFStringTransform(cfstr, &range, kCFStringTransformToUnicodeName, Bool(0)) 
    let newStr = "\(cfstr)" 
    return newStr.stringByReplacingOccurrencesOfString("\\N", withString:"") 
} 

transformUnicode("This is my string ") 
+0

Vielen Dank luk2302, gibt es eine Möglichkeit, die Konvertierung auf Emoji zu beschränken, um auch andere Zeichen wie doppelte Anführungszeichen usw. zu verarbeiten? Ich möchte vermeiden, wenn möglich, zum Beispiel "mit" LINKS DOUBLE QUOTATION MARK "zu ersetzen. – Cue

+0

@Tel Ich glaube nicht, dass es einen einfachen Weg dafür gibt. Es transformiert alle Nicht-ASCII-Zeichen. Das System weiß nicht, was genau ein Smiley ist, es ist nur ein Zeichen, wie der Name schon sagt. Die Tatsache, dass es * wie ein Smiley aussieht, ist nur die menschliche Wahrnehmung der visuellen Darstellung des Unicode. Was Sie möglicherweise tun können, ist herauszufinden, welche Unicode die smileys, die Sie ersetzen möchten, haben und nur diese Zeichen konvertieren.Aber das erfordert etwas Arbeit an deinem Ende. – luk2302

+1

@ luk2302 Gute Antwort, aber es gibt einen einfacheren Weg: 'myString.stringByApplyingTransform (String (kCFStringTransformToUnicodeName), reverse: false)' :) – Moritz

1

Hier ist eine vollständige Implementierung.

Es vermeidet Beschreibung auch die Nicht-Emoji-Zeichen zu konvertieren (z vermeidet es zu {LEFT DOUBLE ANFÜHRUNGSZEICHEN} zu konvertieren). Um dies zu erreichen, verwendet es eine Erweiterung basierend auf this answer by Arnold, die wahr oder falsch zurückgibt, ob eine Zeichenfolge ein Emoji enthält. Der andere Teil des Codes basiert auf this answer by MartinR und die Antwort und Kommentare zu this answer by luk2302.

var str = "Hello World …" // our string (with an emoji and a horizontal ellipsis) 

let newStr = str.characters.reduce("") { // loop through str individual characters 
    var item = "\($1)" // string with the current char 
    let isEmoji = item.containsEmoji // true or false 
    if isEmoji { 
     item = item.stringByApplyingTransform(String(kCFStringTransformToUnicodeName), reverse: false)! 
    } 
    return $0 + item 
}.stringByReplacingOccurrencesOfString("\\N", withString:"") // strips "\N" 


extension String { 
    var containsEmoji: Bool { 
     for scalar in unicodeScalars { 
      switch scalar.value { 
      case 0x1F600...0x1F64F, // Emoticons 
      0x1F300...0x1F5FF, // Misc Symbols and Pictographs 
      0x1F680...0x1F6FF, // Transport and Map 
      0x2600...0x26FF, // Misc symbols 
      0x2700...0x27BF, // Dingbats 
      0xFE00...0xFE0F, // Variation Selectors 
      0x1F900...0x1F9FF: // Various (e.g.) 
       return true 
      default: 
       continue 
      } 
     } 
     return false 
    } 
} 

print (newStr) // Hello World {SMILING FACE WITH OPEN MOUTH AND SMILING EYES} … 

Bitte beachten Sie, dass einige Emojis nicht in den Bereichen dieses Codes aufgenommen werden könnten, so sollten Sie prüfen, ob alle die Emojis zur Zeit umgesetzt werden Sie den Code umsetzt.

+1

Ich habe den Code ein kleines bisschen umgestaltet: http://pastebin.com/qxtWuYNd In erster Linie wird das 'reduce' hinzugefügt, ich habe die außerhalb des Verschlusses definierten Variablen entfernt, aber wo innerhalb davon verwendet, und ich habe das Ersetzen außerhalb des Verschlusses verschoben . – luk2302

+0

Tolle Arbeit luk2302, ich habe deine Änderungen implementiert. – Cue

Verwandte Themen