如何遍历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>
答案 0 :(得分:14)
要删除UITextView中的最后一个字符,只需拨打-deleteBackward
- (void)deleteButtonPressed:(id)sender
{
[self.textView deleteBackward];
}
答案 1 :(得分:2)
我不是unicode专家,但我相信这里的问题是旗帜实际上是两个字符。它们是区域指标符号。例如,美国国旗是两个截然不同的字符:REGIONAL INDICATOR SYMBOL LETTER U
和REGIONAL 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!)
}