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

如何在NSString中遍历emojis有一个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- 😊- 我- 们- - 😊- 😊- 😊- 😊- 😊- 🇷🇺- 🇰🇷- 🇯🇵- 🇺🇸- 

就像美国国旗🇺🇸一样,它由🇺和composed组成。一个国旗的长度似乎是4,它们由两个长度为2的组成字符组成。 而NSString被枚举,它给我🇺和🇸而不是🇺🇸

当string在UITextView中时,轻击键盘中的BACKSPACE,它可以处理删除表情符号🇺🇸而不是🇸。

在我的应用程序,我做了一个自定义的表情符号键盘,并有一个DELETEbutton。 我想DELETEbutton就像键盘上的系统BACKSPACEbutton一样工作。

有谁知道如何处理?

我不是一个unicode专家,但我相信这里的问题是标志实际上是两个字符。 他们是区域指标符号。 例如,美国国旗是两个截然不同的字符: REGIONAL INDICATOR SYMBOL LETTER U字母REGIONAL INDICATOR SYMBOL LETTER UREGIONAL INDICATOR SYMBOL LETTER S字母REGIONAL INDICATOR SYMBOL LETTER S

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

您可能有运气要求文本input系统为您做标记,因为它似乎理解(例如,删除时),他们应该被视为一个单位。 尝试使用UITextInputTokenizer方法positionFromPosition:toBoundary:inDirection:从string末尾移动到前一个字符(即传递UITextGranularityCharacter )。 您可以从UITextView或UITextArea的tokenizer方法获得tokenizer

希望有所帮助!

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

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

下面是一个基于Jesse Rusak的build议的解决scheme,但是,即使UITextInputTokenizer似乎也无法正确parsing文本,除非当然错误是在我的部分:)

 +(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; } } 

如果现代人遇到这种情况,请了解iOS 10或更早版本中已经解决了这个问题。 下面的Swift游乐场代码现在正确地打印标志(区域指示符符号对):

 import Foundation var str = "2017😊我们😊😊😊😊😊🇺🇸🇷🇺🇰🇷🇯🇵" str.enumerateSubstrings(in: str.startIndex..<str.endIndex, options: .byComposedCharacterSequences) { (substr, range, enclRange, stop) in print(substr!) }