Objective c ObjC:如何检测并删除半表情符号中的无效字符?

Objective c ObjC:如何检测并删除半表情符号中的无效字符?,objective-c,unicode,encoding,nsstring,emoji,Objective C,Unicode,Encoding,Nsstring,Emoji,我得到了一个字符串,其中一部分是表情符号,比如说\xF0\x9F\x98\x8F,它被NSString length计算为两个字符,问题是有时我需要通过调用substringToIndex来限制字符串的长度,如果索引恰好位于表情符号的中间,我得到了一个半表情符号,它是一个无效字符,当我打印它时,它作为字符串的一部分不可见,但字符串的长度包含该部分 有办法摆脱这根绳子吗 谢谢 试试看。这将扩大输入范围,以包含表情符号的第二个代理,或包含所有尾随组合字符(如果有) 因为这不是您想要的,所以您应该检测

我得到了一个字符串,其中一部分是表情符号,比如说
\xF0\x9F\x98\x8F
,它被
NSString length
计算为两个字符,问题是有时我需要通过调用
substringToIndex
来限制字符串的长度,如果索引恰好位于表情符号的中间,我得到了一个半表情符号,它是一个无效字符,当我打印它时,它作为字符串的一部分不可见,但字符串的
长度
包含该部分

有办法摆脱这根绳子吗

谢谢

试试看。这将扩大输入范围,以包含表情符号的第二个代理,或包含所有尾随组合字符(如果有)

因为这不是您想要的,所以您应该检测范围何时扩展,并以较小的最大长度重试

假设输出字符串中最多需要10个字符:

NSString *input = ... string possibly containing emoji ...;
NSUInteger maxLength = 10;
maxLength = MIN(maxLength, input.length);
while (maxLength > 0) {
    NSRange range = NSMakeRange(0, maxLength);
    range = [input rangeOfComposedCharacterSequencesForRange:range];
    if (range.length > maxLength) {
        --maxLength;
    } else {
        break;
    }
}
NSString *output = [input substringToIndex:maxLength];
NSLog(@"output = %@", output);