+2
-1

遍历NSString每一个字符的正确方式!

ideawu 发表于 2013年06月12日 12:26 | Hits: 11890
Tag: Cocoa | MacOSX

最近在处理Cocoa NSString时, 遇到一些字符编码的问题, 从而引出一个遍历NSString每一个字符的”正确”方式! 很有趣.

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的每一个字符的方法就是这样了:

NSRange range;
for(int i=0; i<str.length; i+=range.length){
    range = [str rangeOfComposedCharacterSequenceAtIndex:i];
    NSString *s = [str attributedSubstringFromRange:range];
}

一次遍历一个子串, 而不是遍历一个unichar了.

相关资料:

Related posts:

  1. JavaScript+CSS实现数据表格条纹
  2. Cpy是如何打败Python的
  3. 通过 HTTP POST 发送二进制数据
  4. SSDB存储集群
  5. SSDB 的 key_range 和未来的集群之路

你现在看的文章是:遍历NSString每一个字符的正确方式!

原文链接: http://www.ideawu.net/blog/archives/713.html

-1     +2

评价列表(3)

  • -1 guest voted at 2013-06-22 06:25:54

  • +1 guest voted at 2013-06-22 11:36:52

  • +1 guest voted at 2013-07-27 14:16:10