遍历NSString的每一个字符

2019-07-15  本文已影响0人  ShenYj

NSStringUTF-16编码的, 也就是16位unichar字符的序列.

所以, 一般遍历其每一个字符的方法就是:

for(int i = 0; i < str.length; i++)
{
    unichar ch = [str characterAtIndex: i];
}

但是, 我们平常书写的字符, 并不全部都是用唯一的一个16位字符来表示, 而是有一部分用两个16位字符来表示, 这就是surrogate pairs的概念. 如果还是用上面的方法遍历字符串, 就会出现“断字”.

例如Apple Color EmojiTHUMBS UP SIGN字符, 其实是用2个16位unichar来表示, 它的UnicodeU+1F44D, 用(U+D83D U+DC4D)两个字符来表示.

NSStringrangeOfComposedCharacterSequencesForRange: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: 国
上一篇 下一篇

猜你喜欢

热点阅读