ObjC:如何检测和删除半个表情符号中的无效字符?

时间:2015-02-27 05:42:49

标签: objective-c unicode encoding nsstring emoji

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

有没有办法摆脱这个字符串?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

由于这不是你想要的,你应该检测范围何时扩展,然后再尝试使用较小的最大长度。

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

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);