iOS问题集

字符串截取成异常字符

2019-04-04  本文已影响0人  雾霾下的天空

字符串截取过程中因为表情符号在编码中占2个字符, 截取中可能截取到表情符号的一个字符位置, 截取成了乱码. 一般在回退删除字符或者字符数量限制中出现.

/**
 // 字符串截取 完整截取 避免字符异常 取前面的location.

 @param index 截取长度
 @return 截取后的字符串
 */
- (NSString *)subStringWithCharacterSequenceAtIndex:(NSInteger)index {
    NSString *tmpStr = [self copy];
    if(tmpStr.length>index) {
        NSRange range = [tmpStr rangeOfComposedCharacterSequenceAtIndex:index];
        NSInteger substrIndex = range.location;
        tmpStr = [tmpStr substringToIndex:substrIndex];
    }
    return tmpStr;
}
/**
 // 缩略名字  如 [@"xiedonghua" shorStrWithWordsCount:4]  output:  @"xied..."

 @param count 汉字数  如6个汉字
 @return 缩略名
 */
- (NSString *)subStringWithWordsCount:(NSUInteger)count {
    NSUInteger maxShowIndex = 0;
    NSUInteger asciiLength = 0;
    NSUInteger maxAsciiLength = count*2; //最大汉字长度*2
    for (NSUInteger i=0; i<self.length; i++) {
        //每个字符
        unichar uc = [self characterAtIndex:i];
        asciiLength += isascii(uc)?1:2; //如果是 ascii 编码判断是英文字符 长度为1 否则为2
        
        if (asciiLength > maxAsciiLength) { //如果累积的字符长度大于最大长度
            NSString *subStr = [self subStringWithCharacterSequenceAtIndex:maxShowIndex];
            return [NSString stringWithFormat:@"%@...", subStr];
        }else {
            maxShowIndex++; //
        }
    }
    return self;
}


/**
 // 字符串截取  如 [@"中英a1b2c3" subStringWithCharacterCount:6]  output:  @"中英文a1"
 
 @param count 截取字符数(中文算两个字符)
 @return 街区后的字符串
 */
- (instancetype)subStringWithCharacterCount:(NSUInteger)count {
    NSUInteger maxShowIndex = 0;
    NSUInteger asciiLength = 0;
    for (NSUInteger i = 0; i < self.length; i++) {
        //每个字符
        unichar uc = [self characterAtIndex:i];
        asciiLength += isascii(uc)? 1 : 2; //如果是 ascii 编码判断是英文字符 长度为1 否则为2
        if (asciiLength > count) { // 如果累积的字符长度大于最大长度
            NSString *subStr = [self subStringWithCharacterSequenceAtIndex:maxShowIndex];
            return subStr;
        } else {
            maxShowIndex++;
        }
    }
    return self;
}
上一篇 下一篇

猜你喜欢

热点阅读