iOS带Emoji字符串的安全截取

由于需求要求昵称最多显示5个字符,之前写的代码是这个

NSString * nick = [nick substringToIndex:kNickMaxLength];

在有emoji表情的昵称很可能截取出问题,比如这样的昵称:“马致远啊”,其中的“”的length为2,但是截取的字符串长度为5,猴子只剩一半了。。
显示成了这样:


怎么解决呢?

苹果提供的NSString里面rangeOfComposedCharacterSequenceAtIndex方法
可以遍历每个ComposedCharacterSequence单元,普通字符range的length为1,emoji有的为2,有的为4,将来很可能有其他的值。

所以,截取前几个字符可以这个写:

//截取字符前多少位,处理emoji表情问题
//// + 截取3 = 
-(NSString *)subStringWithEmoji:(NSString *)emojiString 
                    limitLength:(NSInteger)limitLength{
    if(emojiString.length < limitLength) return emojiString;
    
    @autoreleasepool {
        NSString * subStr = emojiString;
        NSRange  range;
        NSInteger index = 0;
        for(int i=0; i< emojiString.length; i += range.length){
            range = [emojiString rangeOfComposedCharacterSequenceAtIndex:i];
            NSString * charrrr = [emojiString substringToIndex:range.location + range.length];
            index ++;
            if(index == limitLength){
                subStr = charrrr;
                break;
            }
        }
        return subStr;
    }
}

希望能帮助有需要的朋友。

你可能感兴趣的:(iOS带Emoji字符串的安全截取)