如何在NSString中删除一个表情符号

时间:2012-07-31 23:21:57

标签: ios

如何遍历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按钮一样工作。

有谁知道如何处理它?<​​/ p>

4 个答案:

答案 0 :(得分:14)

要删除UITextView中的最后一个字符,只需拨打-deleteBackward

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

答案 1 :(得分: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方法获取标记生成器。

希望有所帮助!

答案 2 :(得分:1)

以下是基于Jesse 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;
    }
}

答案 3 :(得分:0)

如果有人在现代遇到这种情况,请知道问题已在iOS 10或更早版本中得到修复。以下Swift playground代码现在正确打印标志(区域指示符号对):

import Foundation

var str = "2017我们"

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