2012-07-31 66 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!) 
}