我有一个字符串,其中一部分是表情符号\xF0\x9F\x98\x8F
,它被NSString length
计为两个字符,问题是我有时需要限制字符串&#39 ; s长度通过调用substringToIndex
,如果索引恰好是表情符号的中间,我得到了一个半表情符号,这是一个无效的字符,当我打印它时,它不可见作为一部分字符串,但字符串的length
包含该部分。
有没有办法摆脱这个字符串?
谢谢!
答案 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);