版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.05.30 |
前言
前面我简单的写了些NSString的初始化,写了几篇,都不难,但是可以对新手有一定的小帮助,对于大神级人物可以略过这几篇,NSString本来就没有难的,都是细枝末节,忘记了查一下就会了,没有技术难点,下面我们继续~~~
1. NSString简单细说(一)—— NSString整体架构
2. NSString简单细说(二)—— NSString的初始化
3. NSString简单细说(三)—— NSString初始化
4. NSString简单细说(四)—— 从URL初始化
5. NSString简单细说(五)—— 向文件或者URL写入
6. NSString简单细说(六)—— 字符串的长度
7. NSString简单细说(七)—— 与C字符串的转化
8. NSString简单细说(八)—— 识别和比较字符串
9. NSString简单细说(九)—— 字符串的合并
10. NSString简单细说(十)—— 字符串的分解
11. NSString简单细说(十一)—— 字符串的查找
12. NSString简单细说(十二)—— 字符串的替换
13. NSString简单细说(十三)—— 字符串的分行和分段
字符串位置的计算
在处理cocoa NSString时,遇到一些字符编码问题,NSString是UTF-16编码的,也就是16位的unichar字符的序列,所以我们一般用下列方法进行遍历。
for(int i=0; i<str.length; i++){
unichar ch = [str characterAtIndex: i];
}
但是这么做有一个问题,那就是我们平常书写的字符不都是用一个16位字符表示的,还有一部分用的是两个16位字符来表示,这就是代理对的概念,如果还用上面的代码进行遍历,会出现“断字”,如下图所示:
上图中,这个Apple Color Emoji的"THUMBS UP SIGN"字符, 其实是用2个16位unichar来表示,它的Unicode是U+1F44D, 用(U+D83D U+DC4D)两个字符来表示。下面这两个方法可以很好的解决这个问题。
- 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了。
下面我们看这两个方法。
一、- (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;
下面直接看代码
/**
* 1. - (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;
*
* @param index:The index of a character in the receiver. The value must not exceed the bounds of the receiver.
*
* @return: The range in the receiver of the composed character sequence located at anIndex.
*/
NSString *str = @"ABCDEFdeterminationLocationOfSequenceABCDEF";
NSRange r;
NSMutableString *ss = [[NSMutableString alloc] initWithString:@""]; ;
for(int i=0; i<str.length; i+=r.length){
r = [str rangeOfComposedCharacterSequenceAtIndex:i];
NSString *s = [str substringWithRange:r];
NSLog(@"i=%d,s=%@",i,s);
[ss appendString:s];
}
NSLog(@"ss = %@",ss);
看输出结果
2017-05-31 23:04:53.029 NSString你会用吗?[1493:30621] i=0,s=A
2017-05-31 23:04:53.029 NSString你会用吗?[1493:30621] i=1,s=B
2017-05-31 23:04:53.029 NSString你会用吗?[1493:30621] i=2,s=C
2017-05-31 23:04:53.029 NSString你会用吗?[1493:30621] i=3,s=D
2017-05-31 23:04:53.030 NSString你会用吗?[1493:30621] i=4,s=E
2017-05-31 23:04:53.030 NSString你会用吗?[1493:30621] i=5,s=F
2017-05-31 23:04:53.030 NSString你会用吗?[1493:30621] i=6,s=d
2017-05-31 23:04:53.030 NSString你会用吗?[1493:30621] i=7,s=e
2017-05-31 23:04:53.030 NSString你会用吗?[1493:30621] i=8,s=t
2017-05-31 23:04:53.031 NSString你会用吗?[1493:30621] i=9,s=e
2017-05-31 23:04:53.031 NSString你会用吗?[1493:30621] i=10,s=r
2017-05-31 23:04:53.031 NSString你会用吗?[1493:30621] i=11,s=m
2017-05-31 23:04:53.031 NSString你会用吗?[1493:30621] i=12,s=i
2017-05-31 23:04:53.032 NSString你会用吗?[1493:30621] i=13,s=n
2017-05-31 23:04:53.032 NSString你会用吗?[1493:30621] i=14,s=a
2017-05-31 23:04:53.032 NSString你会用吗?[1493:30621] i=15,s=t
2017-05-31 23:04:53.032 NSString你会用吗?[1493:30621] i=16,s=i
2017-05-31 23:04:53.033 NSString你会用吗?[1493:30621] i=17,s=o
2017-05-31 23:04:53.033 NSString你会用吗?[1493:30621] i=18,s=n
2017-05-31 23:04:53.033 NSString你会用吗?[1493:30621] i=19,s=L
2017-05-31 23:04:53.034 NSString你会用吗?[1493:30621] i=20,s=o
2017-05-31 23:04:53.034 NSString你会用吗?[1493:30621] i=21,s=c
2017-05-31 23:04:53.034 NSString你会用吗?[1493:30621] i=22,s=a
2017-05-31 23:04:53.034 NSString你会用吗?[1493:30621] i=23,s=t
2017-05-31 23:04:53.035 NSString你会用吗?[1493:30621] i=24,s=i
2017-05-31 23:04:53.035 NSString你会用吗?[1493:30621] i=25,s=o
2017-05-31 23:04:53.035 NSString你会用吗?[1493:30621] i=26,s=n
2017-05-31 23:04:53.035 NSString你会用吗?[1493:30621] i=27,s=O
2017-05-31 23:04:53.036 NSString你会用吗?[1493:30621] i=28,s=f
2017-05-31 23:04:53.036 NSString你会用吗?[1493:30621] i=29,s=S
2017-05-31 23:04:53.036 NSString你会用吗?[1493:30621] i=30,s=e
2017-05-31 23:04:53.037 NSString你会用吗?[1493:30621] i=31,s=q
2017-05-31 23:04:53.037 NSString你会用吗?[1493:30621] i=32,s=u
2017-05-31 23:04:53.037 NSString你会用吗?[1493:30621] i=33,s=e
2017-05-31 23:04:53.037 NSString你会用吗?[1493:30621] i=34,s=n
2017-05-31 23:04:53.038 NSString你会用吗?[1493:30621] i=35,s=c
2017-05-31 23:04:53.038 NSString你会用吗?[1493:30621] i=36,s=e
2017-05-31 23:04:53.038 NSString你会用吗?[1493:30621] i=37,s=A
2017-05-31 23:04:53.038 NSString你会用吗?[1493:30621] i=38,s=B
2017-05-31 23:04:53.039 NSString你会用吗?[1493:30621] i=39,s=C
2017-05-31 23:04:53.039 NSString你会用吗?[1493:30621] i=40,s=D
2017-05-31 23:04:53.039 NSString你会用吗?[1493:30621] i=41,s=E
2017-05-31 23:04:53.040 NSString你会用吗?[1493:30621] i=42,s=F
2017-05-31 23:04:53.040 NSString你会用吗?[1493:30621] ss = ABCDEFdeterminationLocationOfSequenceABCDEF
结论:字符串的遍历。
二、- (NSRange)rangeOfComposedCharacterSequencesForRange:(NSRange)range;
看代码
/**
* 2. - (NSRange)rangeOfComposedCharacterSequencesForRange:(NSRange)range;
*
* @param range:A range in the receiver. The range must not exceed the bounds of the receiver.
*
* @return: The range in the receiver that includes the composed character sequences in range.
*/
NSString *str = @"ABCDEFdeterminationLocationOfSequenceABCDEF";
NSRange r = [str rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 20)];
NSString *s = [str substringWithRange:r];
NSLog(@"s == %@",s);
看输出结果
2017-05-31 23:20:27.487 NSString你会用吗?[1680:41283] s == ABCDEFdeterminationL
结论:不知道我举的这个例子是否贴切,希望知道的能和我说一下,谢谢大家。
后记
有些时候发现这些看似简单的东西,由于很少用到,还是有时候是拿不准的,后期我会定向改进,谢谢大家的支持。