NSString簡(jiǎn)單細(xì)說(十四)—— 字符串位置的計(jì)算

版本記錄

版本號(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)嗅绸,謝謝大家的支持脾猛。

奮斗
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鱼鸠,隨后出現(xiàn)的幾起案子猛拴,更是在濱河造成了極大的恐慌,老刑警劉巖蚀狰,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愉昆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡麻蹋,警方通過查閱死者的電腦和手機(jī)跛溉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扮授,“玉大人芳室,你說我怎么就攤上這事∩膊” “怎么了痰憎?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盼产,是天一觀的道長(zhǎng)切威。 經(jīng)常有香客問我砚殿,道長(zhǎng)芽死,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任雹拄,我火速辦了婚禮收奔,結(jié)果婚禮上掌呜,老公的妹妹穿的比我還像新娘滓玖。我一直安慰自己,他們只是感情好质蕉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布势篡。 她就那樣靜靜地躺著,像睡著了一般模暗。 火紅的嫁衣襯著肌膚如雪禁悠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天兑宇,我揣著相機(jī)與錄音碍侦,去河邊找鬼。 笑死隶糕,一個(gè)胖子當(dāng)著我的面吹牛瓷产,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枚驻,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼濒旦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了再登?” 一聲冷哼從身側(cè)響起尔邓,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锉矢,沒想到半個(gè)月后梯嗽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沽损,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年慷荔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缠俺。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡显晶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壹士,到底是詐尸還是另有隱情磷雇,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布躏救,位于F島的核電站唯笙,受9級(jí)特大地震影響螟蒸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜崩掘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一七嫌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苞慢,春花似錦诵原、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辑畦,卻和暖如春吗蚌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纯出。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工蚯妇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暂筝。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓箩言,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親乖杠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子分扎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容