字符串截取过程中因为表情符号在编码中占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;
}
网友评论