遍历NSString的每一个字符
2019-07-15 本文已影响0人
ShenYj
NSString
是UTF-16
编码的, 也就是16位
的unichar
字符的序列.
所以, 一般遍历其每一个字符的方法就是:
for(int i = 0; i < str.length; i++)
{
unichar ch = [str characterAtIndex: i];
}
但是, 我们平常书写的字符, 并不全部都是用唯一的一个16位字符来表示, 而是有一部分用两个16位
字符来表示, 这就是surrogate pairs
的概念. 如果还是用上面的方法遍历字符串, 就会出现“断字”.
例如Apple Color Emoji
的THUMBS UP SIGN字符, 其实是用2个16位unichar
来表示, 它的Unicode
是U+1F44D
, 用(U+D83D U+DC4D
)两个字符来表示.
NSString
的rangeOfComposedCharacterSequencesForRange:
和rangeOfComposedCharacterSequenceAtIndex:
两个方法可以用来处理这种情况.
NSString *str = @"123🐎asdf 中国";
NSRange range;
NSLog(@"%zd", str.length);
for (int i = 0; i < str.length; i++)
{
range = NSMakeRange(i, 1);
NSLog(@" %d: %@", i, [str substringWithRange:range]);
}
for( int i = 0; i < str.length; i += range.length)
{
range = [str rangeOfComposedCharacterSequenceAtIndex:i];
NSLog(@" %d: %@", i, [str substringWithRange:range]);
}
Log:
[65421:21737132] 12
[65421:21737132] 0: 1
[65421:21737132] 1: 2
[65421:21737132] 2: 3
[65421:21737132] 3: \ud83d
[65421:21737132] 4: \udc0e
[65421:21737132] 5: a
[65421:21737132] 6: s
[65421:21737132] 7: d
[65421:21737132] 8: f
[65421:21737132] 9:
[65421:21737132] 10: 中
[65421:21737132] 11: 国
[65421:21737132] 0: 1
[65421:21737132] 1: 2
[65421:21737132] 2: 3
[65421:21737132] 3: 🐎
[65421:21737132] 5: a
[65421:21737132] 6: s
[65421:21737132] 7: d
[65421:21737132] 8: f
[65421:21737132] 9:
[65421:21737132] 10: 中
[65421:21737132] 11: 国