前言:
NSString是大家最常用的一個類,幾乎人人都脫離不開,它的功能非常強大,但是它其中有點奧秘直到碰到了才發現。
正文:
NSString的API中有一個rangeOfString:,這個也是大家常用的在字符串中查找的的Api。我一般圖省事,都是用這個,很少用rangeOfString:option:
正是因為偷懶,才導致了我一個crash,真是記憶深刻。
下面,我先舉一個例子:
明明有一個":",結果就是找不到.這樣導致了我以後代碼出現的crash。這次不是說這個crash,而是要找到原因,為啥這個":",找不到呢。
打印一下length,竟然是2。那為啥找不到呢.換一種方式:
找到了!!!!!
問題解決了,但是為啥會這樣呢?
這個就得看看Unicode的構成了。
Unicode對於組成有兩種形式:合成形式與分解形式。
而NSString的rangeOfString,這個api對此的支持是這樣的。rangeOfString,默認不是按照碼元來查找的,也就是不是按照literalSearch.雖然它裡面包含":",但是,這兩個字符可以合成另一個與其等價的字符,所以就找不到了。
合成字符有的在Unicode字符表中有對應的形式,有的沒有。我舉得例子就沒有。這得根據各種字符的具體規則定義,比如字符+西裡爾字母,就能組出很多種奇怪的字符。
提醒:
如果要在NSString查找字符,一定要帶上option。因為NSString與Unicode還是有很多坑的。
最後,推薦幾篇寫的比較好的文章,介紹NSString與Unicode的。
http://objccn.io/issue-9-1/
http://blog.swanspace.org/ramble_unicode/