版本記錄
版本號 | 時間 |
---|---|
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
結論:不知道我舉的這個例子是否貼切,希望知道的能和我說一下,謝謝大家。
后記
有些時候發現這些看似簡單的東西,由于很少用到,還是有時候是拿不準的,后期我會定向改進,謝謝大家的支持。