2012-07-31 67 views
4

如何遍歷的NSString 表情符號,這裏使用的NSString方法來遍歷的NSString如何刪除一個表情符號中的NSString

NSString *text = @"2012我們 "; 
    [text enumerateSubstringsInRange:NSMakeRange(0, [text length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
    printf("%s- ",[substring UTF8String]); 
}]; 

的子猜猜是什麼輸出?

輸出是:

2- 0- 1- 2- - 我- 們- - - - - - - - - - - - - - - 

不是:

2- 0- 1- 2- - 我- 們- - - - - - - - - - - 

像美國國旗,它是由組成和 標誌的長度似乎是4,和他們被組成兩個長度爲2的組成字符。 雖然列舉了NSString,但它給了我而不是

當字符串在UITextView中時,鍵盤中的BACKSPACE被輕敲,它可以處理刪除表情符號而不是。

在我的應用程序中,我製作了自定義表情符號鍵盤,並且有一個DELETE按鈕。我想要DELETE按鈕就像鍵盤上的系統BACKSPACE按鈕一樣工作。

有誰知道如何處理它?

回答

2

我不是一個unicode專家,但我相信這裏的問題是標誌實際上是兩個字符。它們是地區性指標符號。例如,美國國旗是兩個截然不同的字符:REGIONAL INDICATOR SYMBOL LETTER UREGIONAL INDICATOR SYMBOL LETTER S

http://en.wikipedia.org/wiki/Regional_Indicator_Symbol

你可能有運氣,要求文本輸入系統做標記化你的,因爲它似乎明白了(當刪除,例如),他們應該作爲一個單元進行處理。嘗試使用UITextInputTokenizer方法positionFromPosition:toBoundary:inDirection:將字符串的末尾移到前一個字符(即,通過UITextGranularityCharacter)。您可以從UITextView或UITextArea的tokenizer方法獲得標記器。

希望有幫助!

13

要刪除一個UITextView中的最後一個字符,只需撥打-deleteBackward

- (void)deleteButtonPressed:(id)sender 
    { 
    [self.textView deleteBackward]; 
    } 
1

下面是基於傑西Rusak的建議的解決方案,但即使是UITextInputTokenizer似乎無法正確解析文本,除非當然,錯誤是我的一部分:)

+(void)parse:(UITextField *)textfield { 
    id<UITextInputTokenizer> tokenizer = [textfield tokenizer]; 
    UITextPosition *pos = textfield.beginningOfDocument; 

    while (true) { 
     UITextRange *range = [tokenizer rangeEnclosingPosition:pos withGranularity:UITextGranularityCharacter inDirection:UITextStorageDirectionForward]; 
     NSString *oneCharacter = [textfield textInRange:range]; 

     NSLog(@"%@", oneCharacter); 

     pos = [textfield positionFromPosition:pos offset:-1]; 

     if (pos == nil) break; 
    } 
} 
0

如果有人在當今時代遇到這種情形,知道問題已被固定在iOS的10或更早版本。下面的斯威夫特操場代碼現在正確地打印標誌(區域指示符符號對):

import Foundation 

var str = "2017我們" 

str.enumerateSubstrings(in: str.startIndex..<str.endIndex, options: .byComposedCharacterSequences) { (substr, range, enclRange, stop) in 
    print(substr!) 
}