如何在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 U
和REGIONAL 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!) }