問(wèn)題分析
在javascript ES6中,String多了一個(gè)方法String.raw``嗓节,詳見(jiàn)http://docs.w3cub.com/javascript/global_objects/string/raw/厅目。String.raw``可以把一個(gè)普通的字符串轉(zhuǎn)為Raw String唉工。
舉個(gè)栗子蚯窥,字符串"\abc"沿盅,是3個(gè)字符構(gòu)成痊土,分別是'\a'肄扎,'b','c',通過(guò)String.raw``后犯祠,可以變成4個(gè)字符:'\'旭等,'a','b'衡载,'c'搔耕,也就是把字符串中的'\'表示其本身,而不是轉(zhuǎn)義符月劈。也就是把"\abc"轉(zhuǎn)變成了"\\abc"度迂。
但是在iOS中沒(méi)有String.raw``類(lèi)似的方法,而且在iOS9以下UIWebView/WKWebView中猜揪,不支持ES6語(yǔ)法惭墓,沒(méi)辦法使用String.raw``,所以只能通過(guò)原生轉(zhuǎn)換而姐。那么在iOS中如何轉(zhuǎn)換呢腊凶?
最容易想到的是通過(guò)替換,把"\"替換成"\\"不就行了拴念?思路是對(duì)的钧萍,但是替換不了,因?yàn)?\"不是一個(gè)單獨(dú)的字符政鼠,"\a"才是一個(gè)字符风瘦。
那么把"\a"替換成"\\a"呢?貌似是可以的公般,但是前提是得知道"\"后面的字符万搔。在實(shí)際中,很多情況是不知道"\"后面的字符的官帘,或者知道但是字符特別多瞬雹,都不好處理。
這里提供一種方法可以完成轉(zhuǎn)換刽虹,就是通過(guò)escape編碼酗捌。
實(shí)現(xiàn)過(guò)程
對(duì)原字符串escape編碼——替換——escape解碼
例如字符串"\abc",首先進(jìn)行escape編碼涌哲,編碼方法請(qǐng)點(diǎn)擊胖缤,編碼后的字符串為"%5Cabc"。和原字符串相比可以發(fā)現(xiàn)阀圾,"\"變成了"%5C"哪廓,其他的沒(méi)有變化。是的稍刀,"\"不再是轉(zhuǎn)義符撩独,而變成了普通字符串敞曹,那么就可以對(duì)"%5C"進(jìn)行替換了。如下所示
NSString *str = @"%5Cabc";
[str stringByReplacingOccurrencesOfString:@"%5C" withString:@"%5C%5C"];
這時(shí)候變?yōu)?%5C%5Cabc"综膀,最后再對(duì)str進(jìn)行escape解碼:
str = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
那么澳迫,字符串str就變成"\\abc"了,相當(dāng)于完成了Raw String的轉(zhuǎn)變剧劝。