有一个textView,我可以在其中输入字符。字符可以是a,b,c,d等,也可以使用表情符号键盘添加笑脸。
-(void)textFieldDidEndEditing:(UITextField *)textField{
NSLog(@"len:%lu",textField.length);
NSLog(@"char:%c",[textField.text characterAtIndex:0]);
}
目前,上述功能提供以下输出
if textField.text = @"qq"
len:2
char:q
if textField.text = @"q"
len:3
char:=
我需要的是
if textField.text = @"qq"
len:2
char:q
if textField.text = @"q"
len:2
char:
有任何线索如何做到这一点?
答案 0 :(得分:2)
由于Apple搞砸了表情符号(实际上是超过0的Unicode平面),这变得很困难。似乎有必要通过组合字符进行枚举来获得实际长度。
注意:NSString
方法length
不返回字符数,而是返回unichars中的代码单元数(不是字符数)。请参阅NSString and Unicode - Strings - objc.io issue #9。
示例代码:
NSString *text = @"qqqrrr";
int maxCharacters = 4;
__block NSInteger unicharCount = 0;
__block NSInteger charCount = 0;
[text enumerateSubstringsInRange:NSMakeRange(0, text.length)
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
unicharCount += substringRange.length;
if (++charCount >= maxCharacters)
*stop = YES;
}];
NSString *textStart = [text substringToIndex: unicharCount];
NSLog(@"textStart: '%@'", textStart);
textStart:'qqq'
另一种方法是使用utf32编码:
int byteCount = maxCharacters*4; // 4 utf32 characters
char buffer[byteCount];
NSUInteger usedBufferCount;
[text getBytes:buffer maxLength:byteCount usedLength:&usedBufferCount encoding:NSUTF32StringEncoding options:0 range:NSMakeRange(0, text.length) remainingRange:NULL];
NSString * textStart = [[NSString alloc] initWithBytes:buffer length:usedBufferCount encoding:NSUTF32LittleEndianStringEncoding];
第128节 - 2011年WWDC的高级文本处理有一些理由。
答案 1 :(得分:0)
这就是我用表情符号字符剪切字符串
+(NSUInteger)unicodeLength:(NSString*)string{
return [string lengthOfBytesUsingEncoding:NSUTF32StringEncoding]/4;
}
+(NSString*)unicodeString:(NSString*)string toLenght:(NSUInteger)len{
if (len >= string.length){
return string;
}
NSInteger charposition = 0;
for (int i = 0; i < len; i++){
NSInteger remainingChars = string.length-charposition;
if (remainingChars >= 2){
NSString* s = [string substringWithRange:NSMakeRange(charposition,2)];
if ([self unicodeLength:s] == 1){
charposition++;
}
}
charposition++;
}
return [string substringToIndex:charposition];
}