版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2017.05.30 |
前言
前面我簡(jiǎn)單的寫了些NSString的初始化启盛,寫了幾篇,都不難技羔,但是可以對(duì)新手有一定的小幫助僵闯,對(duì)于大神級(jí)人物可以略過這幾篇,NSString本來就沒有難的藤滥,都是細(xì)枝末節(jié)鳖粟,忘記了查一下就會(huì)了,沒有技術(shù)難點(diǎn)拙绊,下面我們繼續(xù)~~~
1. NSString簡(jiǎn)單細(xì)說(一)—— NSString整體架構(gòu)
2. NSString簡(jiǎn)單細(xì)說(二)—— NSString的初始化
3. NSString簡(jiǎn)單細(xì)說(三)—— NSString初始化
4. NSString簡(jiǎn)單細(xì)說(四)—— 從URL初始化
5. NSString簡(jiǎn)單細(xì)說(五)—— 向文件或者URL寫入
6. NSString簡(jiǎn)單細(xì)說(六)—— 字符串的長(zhǎng)度
7. NSString簡(jiǎn)單細(xì)說(七)—— 與C字符串的轉(zhuǎn)化
8. NSString簡(jiǎn)單細(xì)說(八)—— 識(shí)別和比較字符串
9. NSString簡(jiǎn)單細(xì)說(九)—— 字符串的合并
10. NSString簡(jiǎn)單細(xì)說(十)—— 字符串的分解
11. NSString簡(jiǎn)單細(xì)說(十一)—— 字符串的查找
12. NSString簡(jiǎn)單細(xì)說(十二)—— 字符串的替換
13. NSString簡(jiǎn)單細(xì)說(十三)—— 字符串的分行和分段
字符串位置的計(jì)算
在處理cocoa NSString時(shí)向图,遇到一些字符編碼問題,NSString是UTF-16編碼的标沪,也就是16位的unichar字符的序列榄攀,所以我們一般用下列方法進(jìn)行遍歷。
for(int i=0; i<str.length; i++){
unichar ch = [str characterAtIndex: i];
}
但是這么做有一個(gè)問題金句,那就是我們平常書寫的字符不都是用一個(gè)16位字符表示的檩赢,還有一部分用的是兩個(gè)16位字符來表示,這就是代理對(duì)的概念违寞,如果還用上面的代碼進(jìn)行遍歷贞瞒,會(huì)出現(xiàn)“斷字”,如下圖所示:
上圖中坞靶,這個(gè)Apple Color Emoji的"THUMBS UP SIGN"字符憔狞, 其實(shí)是用2個(gè)16位unichar來表示蝴悉,它的Unicode是U+1F44D彰阴, 用(U+D83D U+DC4D)兩個(gè)字符來表示。下面這兩個(gè)方法可以很好的解決這個(gè)問題拍冠。
- rangeOfComposedCharacterSequencesForRange
- rangeOfComposedCharacterSequenceAtIndex
下面給出正確遍歷NSString的每一個(gè)字符的方法尿这。
NSRange range;
for(int i=0; i<str.length; i+=range.length){
range = [str rangeOfComposedCharacterSequenceAtIndex:i];
NSString *s = [str attributedSubstringFromRange:range];
}
一次遍歷一個(gè)子串簇抵,而不是遍歷一個(gè)unichar了。
下面我們看這兩個(gè)方法射众。
一碟摆、- (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);
看輸出結(jié)果
2017-05-31 23:04:53.029 NSString你會(huì)用嗎?[1493:30621] i=0,s=A
2017-05-31 23:04:53.029 NSString你會(huì)用嗎叨橱?[1493:30621] i=1,s=B
2017-05-31 23:04:53.029 NSString你會(huì)用嗎典蜕?[1493:30621] i=2,s=C
2017-05-31 23:04:53.029 NSString你會(huì)用嗎?[1493:30621] i=3,s=D
2017-05-31 23:04:53.030 NSString你會(huì)用嗎罗洗?[1493:30621] i=4,s=E
2017-05-31 23:04:53.030 NSString你會(huì)用嗎愉舔?[1493:30621] i=5,s=F
2017-05-31 23:04:53.030 NSString你會(huì)用嗎?[1493:30621] i=6,s=d
2017-05-31 23:04:53.030 NSString你會(huì)用嗎伙菜?[1493:30621] i=7,s=e
2017-05-31 23:04:53.030 NSString你會(huì)用嗎轩缤?[1493:30621] i=8,s=t
2017-05-31 23:04:53.031 NSString你會(huì)用嗎?[1493:30621] i=9,s=e
2017-05-31 23:04:53.031 NSString你會(huì)用嗎贩绕?[1493:30621] i=10,s=r
2017-05-31 23:04:53.031 NSString你會(huì)用嗎火的?[1493:30621] i=11,s=m
2017-05-31 23:04:53.031 NSString你會(huì)用嗎?[1493:30621] i=12,s=i
2017-05-31 23:04:53.032 NSString你會(huì)用嗎淑倾?[1493:30621] i=13,s=n
2017-05-31 23:04:53.032 NSString你會(huì)用嗎馏鹤?[1493:30621] i=14,s=a
2017-05-31 23:04:53.032 NSString你會(huì)用嗎?[1493:30621] i=15,s=t
2017-05-31 23:04:53.032 NSString你會(huì)用嗎娇哆?[1493:30621] i=16,s=i
2017-05-31 23:04:53.033 NSString你會(huì)用嗎假瞬?[1493:30621] i=17,s=o
2017-05-31 23:04:53.033 NSString你會(huì)用嗎?[1493:30621] i=18,s=n
2017-05-31 23:04:53.033 NSString你會(huì)用嗎迂尝?[1493:30621] i=19,s=L
2017-05-31 23:04:53.034 NSString你會(huì)用嗎脱茉?[1493:30621] i=20,s=o
2017-05-31 23:04:53.034 NSString你會(huì)用嗎?[1493:30621] i=21,s=c
2017-05-31 23:04:53.034 NSString你會(huì)用嗎垄开?[1493:30621] i=22,s=a
2017-05-31 23:04:53.034 NSString你會(huì)用嗎琴许?[1493:30621] i=23,s=t
2017-05-31 23:04:53.035 NSString你會(huì)用嗎?[1493:30621] i=24,s=i
2017-05-31 23:04:53.035 NSString你會(huì)用嗎溉躲?[1493:30621] i=25,s=o
2017-05-31 23:04:53.035 NSString你會(huì)用嗎榜田?[1493:30621] i=26,s=n
2017-05-31 23:04:53.035 NSString你會(huì)用嗎?[1493:30621] i=27,s=O
2017-05-31 23:04:53.036 NSString你會(huì)用嗎锻梳?[1493:30621] i=28,s=f
2017-05-31 23:04:53.036 NSString你會(huì)用嗎箭券?[1493:30621] i=29,s=S
2017-05-31 23:04:53.036 NSString你會(huì)用嗎?[1493:30621] i=30,s=e
2017-05-31 23:04:53.037 NSString你會(huì)用嗎疑枯?[1493:30621] i=31,s=q
2017-05-31 23:04:53.037 NSString你會(huì)用嗎辩块?[1493:30621] i=32,s=u
2017-05-31 23:04:53.037 NSString你會(huì)用嗎?[1493:30621] i=33,s=e
2017-05-31 23:04:53.037 NSString你會(huì)用嗎?[1493:30621] i=34,s=n
2017-05-31 23:04:53.038 NSString你會(huì)用嗎废亭?[1493:30621] i=35,s=c
2017-05-31 23:04:53.038 NSString你會(huì)用嗎国章?[1493:30621] i=36,s=e
2017-05-31 23:04:53.038 NSString你會(huì)用嗎?[1493:30621] i=37,s=A
2017-05-31 23:04:53.038 NSString你會(huì)用嗎豆村?[1493:30621] i=38,s=B
2017-05-31 23:04:53.039 NSString你會(huì)用嗎液兽?[1493:30621] i=39,s=C
2017-05-31 23:04:53.039 NSString你會(huì)用嗎?[1493:30621] i=40,s=D
2017-05-31 23:04:53.039 NSString你會(huì)用嗎掌动?[1493:30621] i=41,s=E
2017-05-31 23:04:53.040 NSString你會(huì)用嗎四啰?[1493:30621] i=42,s=F
2017-05-31 23:04:53.040 NSString你會(huì)用嗎?[1493:30621] ss = ABCDEFdeterminationLocationOfSequenceABCDEF
結(jié)論:字符串的遍歷粗恢。
二拟逮、- (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);
看輸出結(jié)果
2017-05-31 23:20:27.487 NSString你會(huì)用嗎?[1680:41283] s == ABCDEFdeterminationL
結(jié)論:不知道我舉的這個(gè)例子是否貼切适滓,希望知道的能和我說一下敦迄,謝謝大家。
后記
有些時(shí)候發(fā)現(xiàn)這些看似簡(jiǎn)單的東西凭迹,由于很少用到罚屋,還是有時(shí)候是拿不準(zhǔn)的,后期我會(huì)定向改進(jìn)嗅绸,謝謝大家的支持脾猛。