2016-06-11 3 views
4

이모티콘 문자를 설명 문자열로 대체하는 방법을 찾고 있습니다.이모티콘 문자를 Swift 문자열의 설명으로 바꾸는 방법

예 : 내가 사용하고 현재까지

출력 "This is my string {SMILING FACE WITH OPEN MOUTH AND SMILING EYES}"

을 : "This is my string "

내가 얻을를 교체하고 싶습니다

입력 이 코드는 O riginal code가 this answer by MartinR인데 단 하나의 문자 만 처리하면 작동합니다.

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} 

어떻게하면됩니까?

+2

일반적으로 [이 답변은 MartinR] (http://stackoverflow.com/a/24701154/2442804) – luk2302

+0

에서 원래 코드를 얻었음에 유의해야합니다. 완료, luk2302 댓글 주셔서 감사합니다. – Cue

답변

7

는 단순히 처음에 Character를 사용하지만 입력으로 String을 사용하지 마십시오

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

것이다 마지막으로이 {입을 열고 미소를 눈으로 웃는 얼굴이}

출력 내 끈 {입을 열고 입을 벌리고 펴는 얼굴}

함께 쓰다 :

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

luk2302 정말 고맙습니다. 이모티콘 변환을 제한하는 방법이 있습니까? 이중 따옴표 같은 다른 문자도 처리하지 않으시겠습니까? 가능하다면 예를 들어 "LEFT DOUBLE QUOTATION MARK"로 바꾸는 것을 피하고 싶습니다. – Cue

+0

@Tel 나는 쉬운 방법이 있다고 생각하지 않는다. 모든 비 ASCII 문자를 변환합니다. 이 시스템은 정확하게 웃는 얼굴이 무엇인지 모릅니다. 이름에서 알 수 있듯이 그저 캐릭터 일뿐입니다. 웃는 얼굴처럼 보이는 것은 유니 코드의 시각적 표현에 대한 인간의 인식 일뿐입니다. 당신이 할 수있는 일은 당신이 대체 할 수있는 스마일 문자가 가지고있는 유니 코드 문자 코드가 무엇인지 파악하고 그 문자 만 변환하는 것입니다.그러나 그것은 당신의 목적에 대한 몇 가지 작업을 요구할 것입니다. – luk2302

+1

@ luk2302 좋은 대답이지만, 더 간단한 방법이 있습니다 :'myString.stringByApplyingTransform (String (kCFStringTransformToUnicodeName), reverse : false)':) – Moritz

1

다음은 완전한 구현입니다.

또한 설명을 비 이모티콘 문자 변환 방지

(예를 들어 그것을 변환 방지 "{LEFT 따옴표 MARK}). 이를 위해 this answer by Arnold을 기반으로하는 확장을 사용합니다.이 확장은 문자열에 그림이 포함되어 있는지 여부를 true 또는 false로 반환합니다.

코드의 다른 부분은 this answer by MartinR을 기반으로하고 대답과 설명은 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} … 

어떤 이모티콘이 코드의 범위에 포함되지 않을 수 있습니다, 그래서 당신은 모든 이모티콘이 시간에 변환하는 경우 코드를 구현할 확인해야합니다.

+1

코드를 약간 리팩터링했습니다 : http://pastebin.com/qxtWuYNd 주로'reduce'가 추가되었습니다. 클로저 밖에서 정의 된 변수를 제거했지만 내부에서 사용 된 곳과 클로저 외부에서 대체되었습니다. . – luk2302

+0

위대한 작품 luk2302, 나는 당신의 변화를 구현했습니다. – Cue

관련 문제