ios 开发 NSString 正确遍历字符个数方式 (surrogate pairs)
来源:互联网 发布:excel2007编程实例vb 编辑:程序博客网 时间:2024/06/06 07:05
最近在处理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了.
-(NSString *)subStringWith:(NSString *)string ToIndex:(NSInteger)index{ NSString *result = string; if (result.length > index) { NSRange rangeIndex = [result rangeOfComposedCharacterSequenceAtIndex:index]; result = [result substringToIndex:(rangeIndex.location)]; } return result;}
0 0
- ios 开发 NSString 正确遍历字符个数方式 (surrogate pairs)
- 【iOS开发】判断NSString中的字符是否为中文的正确方法
- iOS开发 正确选择图片加载方式
- iOS开发 正确选择图片加载方式
- iOS NSString 连接方式
- iOS开发-NSString
- iOS开发-NSString-1
- iOS开发-NSString-2
- iOS开发之NSString
- ios开发之NSString
- 系列:iOS开发-NSString
- iOS开发中遍历方式 (有借鉴)
- iOS开发NSString篇:字符串每隔几个字符插入某个字符
- iOS NSString 没有去除首尾空格,换行符,空字符--导致UIlabel不能正确计算换行后的动态高度
- NSString , NSArray和NSDictionary的遍历方式
- How to remove UCS-2 surrogate pairs in SQL Server?
- iOS开发笔记之NSString 过滤空白字符和换行符
- iOS开发:字符编码-判断NSString是纯汉字还是含有汉字
- hadoop 2.7.1 高可用安装部署
- float x 与“零值”比较
- Leetcode 400. Nth Digit[easy]
- 深入理解Java:注解(Annotation)自定义注解入门
- Robot Motion(模拟法)
- ios 开发 NSString 正确遍历字符个数方式 (surrogate pairs)
- webuploader解决不能重复上传问题
- 若有x = 1,y = 2, z = 3,则表达式(x<y?x:y)==z++的值?
- FreeRTOS代码剖析之5:链表管理list.c
- centos下安装jdk后,出现该错误cannot execute binary file
- 原迹手写之贝赛尔曲线(穿过已知点画平滑曲线(3次贝塞尔曲线)
- Android selector 状态选择器
- 线性代数基础课1-1
- 打包备份linux整个系统