截取包含表情符的字符串时,如何获取完整的字符长度?


在截取字符串时,有时我们需要考虑表情符字符,因为不同的表情符字符长度不一样,例如:??的长度为2。

NSLog(@"length: %ld", @"??".length);
// 此处输出为:length: 2
NSLog(@"length: %ld", @"????".length);
// 此处输出为:length: 4

因此我们在通过NSRange截取字符串时,我们需要获取到完整的字符长度,例如:abcd??。

NSString *str = @"abcd??";
// 如果你只是认为这个字符串长度为5,那你就错了,在执行下面代码时,substring不是你想要的
NSString *substring = [str substringWithRange:NSMakeRange(0, 5)];
NSLog(@"substring: %@", substring);
// 此处输出为:abcd,系统会将错误的表情字符放弃,因为??占2个字符长度,而你只截取了其中一半的字符

那么针对这种问题,我们可以通过以下方法,来获取包含完整表情符的字符长度

NSRange range = [str rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 5)];
NSLog(@"location: %ld,length:%ld", range.location, range.length);
// 此处输出为:location:0,length:6

这里输出的length为包含完整字符的长度:6而不是5